কিভাবে স্থানীয় গিট কমিট বাতিল করবেন


742

আমার সমস্যাটি হ'ল আমি একটি ফাইল পরিবর্তন করেছি যেমন: পুনরায় পড়ুন, একটি নতুন লাইন যুক্ত করলেন ' এটি আমার পরীক্ষার লাইনের জন্য ' এবং ফাইলটি সংরক্ষণ করে, তারপরে আমি নিম্নলিখিত কমান্ডগুলি জারি করেছি

 git status

 # On branch master
 # Changed but not updated:
 #   (use "git add <file>..." to update what will be committed)
 #   (use "git checkout -- <file>..." to discard changes in working directory)
 #
 #  modified:   README
 #
 no changes added to commit (use "git add" and/or "git commit -a")


 git add README

 git commit -a -m 'To add new line to readme'

আমি কোডটি গিথুবে চাপলাম না, এখন আমি এই প্রতিশ্রুতি বাতিল করতে চাই।

এই জন্য আমি ব্যবহার

   git reset --hard HEAD~1

তবে আমি README ফাইলটি থেকে ' আমার টেস্টিং লাইনের জন্য ' নতুন যুক্ত হওয়া লাইনটি হারিয়েছি । এটি হওয়া উচিত নয়। আমার কন্টেন্টটি সেখানে থাকতে হবে। বিষয়বস্তু ধরে রাখতে এবং আমার স্থানীয় প্রতিশ্রুতি বাতিল করার কোনও উপায় আছে কি?


3
দেখে মনে হচ্ছে আপনি অবশ্যই চাইছেন না git revert, যা প্রত্যাবর্তিত প্রতিশ্রুতির বিপরীত ভিন্নতার সাথে একটি নতুন প্রতিশ্রুতি তৈরি করে। রিসেট করা সহজভাবে আপনার বর্তমান শাখাটিকে একটি ভিন্ন প্রতিশ্রুতিতে নির্দেশ করে, এক্ষেত্রে, প্রতিশ্রুতির আগে যেটি আপনি "ভুলে যেতে" চান।
ক্যাস্যাবল

1
এনবি: git-commitআপনি ম্যাসেজটি ফাঁকা রেখে দিলে তা বাতিল করতে পারে , তাই যদি আপনি সত্যিকারের প্রতিশ্রুতিটি শেষ না করেন যা সহায়ক হতে পারে।
GKFX

উত্তর:


1416

পতাকা git resetছাড়া কেবল ব্যবহার করুন --hard:

git reset HEAD~1

পিএস: ইউনিক্স ভিত্তিক সিস্টেমে আপনি ব্যবহার করতে পারবেন HEAD^যা সমান HEAD~1। উইন্ডোজে HEAD^কাজ করবে না কারণ ^একটি লাইনের ধারাবাহিকতার সংকেত দেয়। সুতরাং আপনার কমান্ড প্রম্পট কেবল আপনাকে জিজ্ঞাসা করবে More?


13
যাইহোক, --mixed ম্যানুয়ালটিতে এটিকে বলা হয়
জোশ লি

10
গীতের নতুন সংস্করণগুলি এমনকি @^শর্টহ্যান্ড হিসাবে অনুমতি দেয় HEAD^
Koraktor

আমি জানি না এটি কী করেছিল, তবে আমার পরিবর্তন তালিকায় প্রচুর ফাইল প্রস্তুত হয়েছে, যে ফাইলগুলি আমি স্পর্শ করি নি
এফআরআর

@ ফেয়ার্সার যদি আপনি সত্যিই শেষ প্রতিশ্রুতি বা কার্যনির্বাহী গাছগুলিতে এই ফাইলগুলিকে স্পর্শ না করেন তবে এটি আপনার কার্যকরী গাছের অন্যান্য অসঙ্গতিগুলির কারণে ঘটে, যেমন আপনি উইন্ডোজ এবং ফাইলের সমাপ্তি মেলে না।
Koraktor

1
একদিকে সমস্ত প্রতিশ্রুতি পুনরায় সেট করা সম্ভব?
ওয়েবউইম

185

পতাকার --softপরিবর্তে ব্যবহার করুন --hard:

git reset --soft HEAD^

18
আপনি দুটি পতাকা মধ্যে পার্থক্য ব্যাখ্যা করতে পারেন?
জন গিয়োটা

1
আপনি যদি প্যাকেজ ম্যানেজার কনসোলটি খোলেন এবং এই "গিট রিসেট --Soft হেড ^" চালান, এটি আপনার যা চান তা করে (এবং আমার কী প্রয়োজন)।
ডেভিড কর্নেলসন

54
@ জনগিয়োটা - git reset --soft HEAD^সর্বশেষ স্থানীয় (শৃঙ্খলাবদ্ধ) প্রতিশ্রুতি সরিয়ে দেবে তবে আপনি যে পরিবর্তনগুলি করেছেন তা
বজায় রাখবেন

@ ফাইডার ত্রাণকর্তা! স্বীকৃত উত্তরটি এখনও কাজ করে কিনা তা নিশ্চিত নয় তবে এটি ওপি-র প্রয়োজনীয় সঠিক উত্তর হওয়া উচিত।
বাবু

git reset --soft HEAD~উইন্ডোজে
জ্যাক 0fshad0ws

34

আপনি যদি কোনও প্রতিশ্রুতির মাঝামাঝি থাকেন (যেমন ইতিমধ্যে আপনার সম্পাদকে) তবে আপনি প্রথমটির উপরের সমস্ত লাইন মুছে ফেলে এটি বাতিল করতে পারেন #। যে প্রতিশ্রুতি বাতিল।

সুতরাং আপনি সমস্ত লাইন মুছতে পারেন যাতে প্রতিশ্রুতি বার্তাটি ফাঁকা থাকে, তারপরে ফাইলটি সংরক্ষণ করুন:

এটিকে ঐটির মত দেখতে হবে।

তারপরে আপনি একটি বার্তা পাবেন যা এতে বলে Aborting commit due to empty commit message.

সম্পাদনা :

আপনি সমস্ত লাইন মুছতে পারেন এবং ফলাফলটি হুবহু একই রকম হবে।

ভিমে সমস্ত লাইন মুছে ফেলতে (যদি এটি আপনার ডিফল্ট সম্পাদক হয়), একবার আপনি সম্পাদকে থাকলে ggপ্রথম লাইনে গিয়ে টাইপ করুন , তারপরে dGসমস্ত লাইন মুছে ফেলুন। শেষ পর্যন্ত, ফাইলটি লিখুন এবং প্রস্থান করুন wqএবং আপনার প্রতিশ্রুতি বাতিল করা হবে।


3
আমি ঠিক এটিই খুঁজছিলাম! এই উত্তরের আরও বেশি প্রয়োজন :)
jdunk

এফওয়াইআই, এটিও কাজ করে যদি আপনি rebase -i mybranchname
ইনোস্টিয়া

18

আপনার প্রথমে যেটি করা উচিত তা হ'ল প্রতিশ্রুতিবদ্ধ বার্তাটি মোছার আগে আপনি স্থানীয় পরিবর্তনগুলি রাখতে চান কিনা তা নির্ধারণ করা।

git logবর্তমান প্রতিশ্রুতি বার্তাগুলি দেখানোর জন্য ব্যবহার করুন, তারপরে আপনি যে প্রতিশ্রুতি মুছতে চান তার commit_id আগে সন্ধান করুন, আপনি যে প্রতিশ্রুতি মুছতে চান তা নয়।

আপনি যদি স্থানীয়ভাবে পরিবর্তিত ফাইলগুলি রাখতে চান এবং কেবল প্রতিশ্রুতি বার্তা মুছুন:

git reset --soft commit_id

আপনি যদি স্থানীয়ভাবে পরিবর্তিত সমস্ত ফাইল এবং প্রতিশ্রুতি বার্তা মুছতে চান:

git reset --hard commit_id

যে পার্থক্য নরম এবং হার্ড


1
আমি মনে করি এটি বিপরীত
রুফ

9

আপনি গিটকে আপনার সূচক (পরবর্তী প্রতিশ্রুতিতে পরিণত হওয়া ফাইলগুলির সেট) এবং কার্যকারিতা ডিরেক্টরিতে কী করতে হবে তা কোনও পরামিতি ব্যবহার করে গিট রিসেট করার সময় বলতে পারেন:

--soft: সূচি এবং কার্যনির্বাহী ডিরেক্টরি পরিবর্তিত না হলে কেবল কমিটগুলি পুনরায় সেট করা হবে।

--mixed: এটি হেডের সাথে মেলানোর জন্য সূচিটি পুনরায় সেট করবে, যখন কর্মরত ডিরেক্টরিটি স্পর্শ করা হবে না। সমস্ত পরিবর্তন কার্যকারী ডিরেক্টরিতে থাকবে এবং পরিবর্তিত হিসাবে উপস্থিত হবে।

--hard: এটি হেডের সাথে মেলে সমস্ত কিছু (কমিট, সূচক, কার্যকারী ডিরেক্টরি) পুনরায় সেট করে।

আপনার ক্ষেত্রে, আমি git reset --softসূচি এবং কার্যনির্বাহী ডিরেক্টরিতে আপনার পরিবর্তিত পরিবর্তনগুলি রাখতে ব্যবহার করব । চেক করতে ভুলবেন না এই আউট আরো বিস্তারিত ব্যাখ্যার জন্য।


1

কমান্ড নীচে ব্যবহার করুন:

$ git reset HEAD~1

এর পরে আপনি নীচের প্রতিক্রিয়াগুলির মতো ফিরে যা ফাইলগুলি দেখতে সক্ষম হন।

Unstaged changes after reset:
M   application/config/config.php
M   application/config/database.php
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.