बदलावों को खोए बिना अंतिम अन-पुश किए गए कमिट को अन-कमिट कैसे करें


539

क्या कोई तरीका है कि मैं अपनी स्थानीय प्रति वापस लाऊं उस कमिटमेंट में किए गए परिवर्तनों को रख सकता हूँ, लेकिन वे मेरी कार्य प्रति में गैर-प्रतिबद्ध परिवर्तन बन जाते हैं? एक कमिट को वापस करने से आपको पिछली कमिटमेंट में ले जाता है - मैं किए गए बदलावों को रखना चाहता हूं, लेकिन मैंने उन्हें गलत ब्रांच के लिए प्रतिबद्ध किया है।

यह धक्का नहीं दिया गया है, केवल प्रतिबद्ध है।



6
git reset --softऔर git reset --mixedदोनों ऐसा करते हैं (थोड़ा अलग), देखें git-reset
torek

जवाबों:


930

उदाहरण के लिए, ऐसा करने के कई तरीके हैं:

मामले में आप है नहीं धकेल दिया सार्वजनिक रूप से अभी तक प्रतिबद्ध:

git reset HEAD~1 --soft   

यही है, आपके प्रतिबद्ध परिवर्तन आपकी कार्यशील निर्देशिका में होंगे, जबकि LAST प्रतिबद्ध आपकी वर्तमान शाखा से हटा दिया जाएगा। देखिए रीसेट रीसेट मैन


मामले में आप किया था धक्का सार्वजनिक रूप से (एक शाखा 'गुरु' कहा जाता है पर):

git checkout -b MyCommit //save your commit in a separate branch just in case (so you don't have to dig it from reflog in case you screw up :) )

सामान्य रूप से कमिट करें और पुश करें

git checkout master
git revert a8172f36 #hash of the commit you want to destroy
# this introduces a new commit (say, it's hash is 86b48ba) which removes changes, introduced in the commit in question (but those changes are still visible in the history)
git push origin master

अब यदि आप अपनी कार्य प्रति में स्थानीय परिवर्तन के रूप में उन बदलावों को करना चाहते हैं ("ताकि आपकी स्थानीय प्रति उस कमिट में किए गए बदलावों को बनाये रखे") - --no-commitविकल्प के साथ रिवर्ट कमिट को वापस कर दें :

git revert --no-commit 86b48ba (hash of the revert commit).

मैंने एक छोटा उदाहरण तैयार किया है: https://github.com/Isantipov/git-revert/commits/master


5
बहुत बहुत धन्यवाद, मेरे मामले में मेरे पास दो कमिट थे जिन्हें मैं रद्द करना चाहता था, और एक पंक्ति में दो बार 'git रीसेट HEAD ~ 1 --soft' चलाने से मुझे वह मिल गया जहां मुझे होना चाहिए था।
ज्योफ गंटर

2
यदि आप सीएलआई का उपयोग नहीं कर रहे हैं, तो थोड़ी स्पष्टता जोड़ने के लिए, पहले resetबताई गई कमांड सिर से पहले 1 रेव के लिए "सॉफ्ट" रीसेट कह रही है, जो सभी स्थानीय परिवर्तनों को संरक्षित करता है। यह मेरे लिए SourceTree में उपयोग के लिए तुरंत स्पष्ट नहीं था। बस यह सुनिश्चित करें कि आप पिछले रेव में नरम रीसेट कर रहे हैं, रिवाइज करने का प्रयास नहीं कर रहे हैं
जॉन बी

1
मैंने "पहले से ही धकेल दिया" दृष्टिकोण की कोशिश की और यह मेरे लिए काम नहीं करता है, git 2.14.1 के साथ: यह कहता है "Already up to date"कि मर्ज करते समय।
फैबियो ए।

1
@FabioA। , मैंने उत्तर को एक कार्यशील संस्करण के साथ अद्यतन किया है। यह ध्यान देने के लिए धन्यवाद!
इसांतिपोव

1
यह काम नहीं करता है। मैंने रीसेट और कमिट किया और केवल git को वापस ला दिया और बाहर धकेल दिया ... अब परिवर्तन शायद अभी तक सुनिश्चित नहीं हुए हैं ... सौभाग्य से मैंने एक आसान तरीका बना लिया है उम्मीद है कि अभी भी काम करेगा;) अन्यथा उस एक से परिवर्तन को कॉपी कर सकते हैं; ।
स्काईबक फ्लाइंग

13

यदि आपने परिवर्तनों को धकेल दिया है, तो आप undoदूसरी शाखा का उपयोग किए बिना फ़ाइलों को वापस स्टेज पर ले जा सकते हैं ।

git show HEAD > patch
git revert HEAD
git apply patch

यह एक पैच फ़ाइल बनाएगा जिसमें अंतिम शाखा परिवर्तन होते हैं। फिर यह परिवर्तनों को वापस करता है। और अंत में, काम करने वाले पेड़ पर पैच फाइलें लागू करें।


आप भी चाहते rm patchहैं
मैक्स कोपलान

6

मामले के लिए: "यह धक्का नहीं दिया गया है, केवल प्रतिबद्ध है ।" - यदि आप IntelliJ (या किसी अन्य JetBrains IDE) का उपयोग करते हैं और आपने अभी तक किए गए परिवर्तनों को आगे नहीं बढ़ाया है

  1. संस्करण नियंत्रण विंडो ( Alt + 9 / कमांड + 9 ) पर जाएं - "लॉग" टैब।
  2. अपने पिछले एक से पहले एक कमेंट पर राइट-क्लिक करें।
  3. यहां पर वर्तमान शाखा को रीसेट करें
  4. लेने शीतल (!!!)
  5. डायलॉग विंडो के निचले भाग में रीसेट बटन दबाएं।

किया हुआ।

यह आपके परिवर्तनों को "अनलमिटेड" कर देगा और आपके अंतिम स्थानीय कमिट से पहले बिंदु पर आपकी स्थिति को लौटा देगा। आपके द्वारा किए गए कोई भी परिवर्तन नहीं खोएंगे।


2
मुझे JetBrains तरीका सीखना बहुत पसंद है, धन्यवाद! यह git reset --soft "HEAD^"विंडोज, btw पर बराबर है । :)
पायने

3

मेरे साथ ज्यादातर ऐसा तब होता है जब मैं गलत शाखा में परिवर्तन करता हूं और बाद में महसूस करता हूं। और ज्यादातर समय में काम करता है।

git revert commit-hash
git push

git checkout my-other-branch
git revert revert-commit-hash
git push
  1. कमिट करें
  2. (बनाएँ और) चेकआउट अन्य शाखा
  3. वापस लौटना

1
मैंने यह परीक्षण किया। आपका दृष्टिकोण भी काम करता है यदि आपने रिमोट से धक्का नहीं दिया है। $ git रिवर्ट <कमिट-हैश> ... फिर कुछ अन्य ब्रांच चेकआउट करें, फिर $ git रिवर्ट टाइप करें <रीवर्ट-कमिट-हैश> (पुश के बिना)। इस सरल दृष्टिकोण को साझा करने के लिए धन्यवाद !!
नताली कॉट्रिल

1

कृपया इन अलग-अलग फ़ोल्डर में इन कॉमनैंड को चलाने से पहले अपने परिवर्तनों का बैकअप लेना सुनिश्चित करें

git चेकआउट शाखा_नाम

अपनी शाखा पर चेकआउट करें

git मर्ज --abort

मर्ज को रोकें

गिट स्थिति

मर्ज निरस्त करने के बाद कोड की स्थिति की जाँच करें

git रीसेट -हार्ड मूल / शाखा_नाम

ये कमांड आपके बदलावों को रीसेट करेगा और अपने कोड को Branch_name (शाखा) कोड के साथ संरेखित करेगा।


1

2020 सरल तरीका:

git reset <commit_hash>

आखिरी हैश का कमिट हैश रखना चाहते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.