मैं अनपिट गिट कमिट्स को कैसे हटाऊं?


946

मैं गलती से गलत शाखा के लिए प्रतिबद्ध हूं। मैं उस कमिट को कैसे हटाऊं?

जवाबों:


1807

आपके द्वारा किए गए कार्य को ध्यान में रखते हुए, हाल की प्रतिबद्धताओं को हटाएँ:

git reset --soft HEAD~1

अपने द्वारा किए गए कार्य को नष्ट करते हुए , सबसे हालिया प्रतिबद्ध हटाएं :

git reset --hard HEAD~1

13
सुनिश्चित करें कि HEAD शाखा की ओर इशारा कर रहा है .. (इसे पहले देखें)
फ्रैंक श्वेटरमैन

128
और सुनिश्चित करें कि HEAD ~ 1 कमिट है ... आप यह भी कर सकते हैंgit reset --hard origin
Daenyth

13
सोचा git remoteसूची मेरे लिए मूल है, git reset --hard originकहते हैं fatal: ambiguous argument 'origin': unknown revision or path not in the working tree.। क्यों?
trss

7
यह कमाल का है। बस मेरी जान बच गई।
निंजाबॉय

2
git reset HEAD~1आपके सभी परिवर्तनों को भी रखेगा लेकिन आपको सब कुछ रखने के बजाय एक खाली सूचकांक के साथ छोड़ देगा (जैसा कि --softविकल्प होगा)।
होलोले

138

मुझे आश्चर्य है कि मैंने जो सबसे अच्छा उत्तर पाया है, वह केवल टिप्पणियों में है! ( 86 वोटों से डेंयथ द्वारा )

git reset --hard origin

यह आदेश स्थानीय रिपॉजिटरी को दूरस्थ रिपॉजिटरी के साथ सिंक करेगा, जो आपके स्थानीय पर किए गए हर बदलाव से छुटकारा दिलाएगा। आप मूल में मौजूद सटीक शाखा लाने के लिए निम्न कार्य भी कर सकते हैं।

git reset --hard origin/<branch>

16
इस के लिए धन्यवाद, स्पष्टीकरण थोड़ा विस्तार हो: एक विशिष्ट शाखा के लिए:git reset --hard origin/<branch>
Cleary

4
या git reset --soft origin/<branch>, यदि आप कमिट से छुटकारा पाना चाहते हैं, लेकिन स्थानीय कार्य को जारी रखें।
रिवरहोर्स

1
मुझे मिलता है fatal: ambiguous argument 'origin': unknown revision or path not in the working tree., आपको शाखा निर्दिष्ट करने की आवश्यकता है जैसे:git reset --hard origin/feature/my-cool-stuff
किप

प्रतिभाशाली! यह वास्तव में "स्वीकृत" उत्तर के विपरीत काम करता है, जो सिर्फ सिर को अलग करता है और आपको लटका देता है।
मॅई

55

इसे न हटाएं: सिर्फ एक कमिट के git cherry-pickलिए पर्याप्त है।

लेकिन अगर आपके पास गलत शाखा पर कई कमिट थे , तो वह git rebase --ontoचमकता है:

मान लीजिए कि आपके पास यह है:

 x--x--x--x <-- master
           \
            -y--y--m--m <- y branch, with commits which should have been on master

, तब आप उसे चिन्हित कर सकते हैं masterऔर उस जगह ले जा सकते हैं जहाँ आप होना चाहते हैं:

 git checkout master
 git branch tmp
 git checkout y
 git branch -f master

 x--x--x--x <-- tmp
           \
            -y--y--m--m <- y branch, master branch

रीसेट y शाखा जहां यह होना चाहिए था:

 git checkout y
 git reset --hard HEAD~2 # ~1 in your case, 
                         # or ~n, n = number of commits to cancel

 x--x--x--x <-- tmp
           \
            -y--y--m--m <- master branch
                ^
                |
                -- y branch

, और अंत में अपने कमिट्स को स्थानांतरित करें (उन्हें फिर से लागू करें, वास्तव में नए कमिट करें)

 git rebase --onto tmp y master
 git branch -D tmp


 x--x--x--x--m'--m' <-- master
           \
            -y--y <- y branch

दुर्भाग्य से, यह सवाल नहीं था।
कटारिया

1
@ कटारिया गलत शाखा पर किए गए कमिट को हटाने का एक वैध विकल्प है और दूसरों को उसी स्थिति (गलत शाखा पर किए गए अच्छे काम) में मदद करेगा।
VonC

14

ऐसा न करें git rebase -i FAR_ENOUGH_BACKऔर आप जो नहीं चाहते हैं उसके लिए लाइन ड्रॉप करें।


6

यदि आप उस कमेटी को दूसरी ब्रांच में स्थानांतरित करना चाहते हैं, तो विचाराधीन एसएचए प्राप्त करें

git rev-parse HEAD

फिर करंट ब्रांच को स्विच करें

git checkout other-branch

और cherry-pickकरने के लिए प्रतिबद्ध हैother-branch

git cherry-pick <sha-of-the-commit>

मेरे अनुभव से, यह मूल शाखा से प्रतिबद्ध को पूर्ववत नहीं करता है, इस प्रकार git reset --hard HEAD~1बाद में आवश्यक है । मुझे लगता है कि reset --softतब शाखाओं को बदलना और फिर से काम करने से अतिरिक्त काम बच जाता। तब फिर से मैं अपने सभी मूल सामानों को करने के लिए SourceTree का उपयोग कर रहा था, केवल मेरी त्रुटि के बाद इसके साथ कमांड-लाइन।
जसुपी

3

आपके संदर्भ के लिए, मेरा मानना ​​है कि आप अपनी वर्तमान शाखा से "हार्ड कट" कर सकते हैं, न केवल गिट रीसेट - भार के साथ, बल्कि निम्न कमांड के साथ:

git checkout -B <branch-name> <SHA>

वास्तव में, अगर आपको चेक आउट करने की परवाह नहीं है, तो आप जो चाहें उसके साथ शाखा सेट कर सकते हैं:

git branch -f <branch-name> <SHA>

उदाहरण के लिए, एक शाखा से कमिट को हटाने के लिए यह एक प्रोग्रामेटिक तरीका होगा, उदाहरण के लिए, इसे (रिबेट का उपयोग करके) नए कॉम्पट को कॉपी करने के लिए।

मान लीजिए कि आपके पास एक शाखा है जिसे मास्टर से डिस्कनेक्ट किया गया है क्योंकि आपने किसी अन्य स्थान से स्रोत ले लिए हैं और इसे शाखा में डंप कर दिया है।

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

अब आप अपनी विषय शाखा का एक डुप्लिकेट बनाएंगे और फिर इसे उस सोर्स कोड डंप पर रीबेज करेंगे जो ब्रांच "डंप" में बैठा है:

git branch topic_duplicate topic
git rebase --onto dump master topic_duplicate

अब आपके परिवर्तनों को "डंप" के शुरुआती बिंदु के आधार पर शाखा topic_duplicate में फिर से लागू किया गया है, लेकिन केवल "मास्टर" के बाद से किए गए कमिट हैं। इसलिए मास्टर के बाद से आपके परिवर्तन अब "डंप" के शीर्ष पर फिर से लागू होते हैं, लेकिन परिणाम "topic_duplicate" में समाप्त होता है।

आप तब "डंप" को "topic_duplicate" से बदल सकते हैं:

git branch -f dump topic_duplicate
git branch -D topic_duplicate

या के साथ

git branch -M topic_duplicate dump

या सिर्फ डंप को त्यागकर

git branch -D dump

शायद आप वर्तमान "topic_duplicate" को साफ़ करने के बाद सिर्फ चेरी-पिक कर सकते हैं।

मैं जो कहना चाह रहा हूं वह यह है कि यदि आप एक अलग पूर्वज की वर्तमान "डुप्लिकेट" शाखा को अपडेट करना चाहते हैं, तो आपको पहले "चेरीपाइटल" को एक git reset --hard <last-commit-to-retain>या एक करके कमिट करना होगा git branch -f topic_duplicate <last-commit-to-retain>और फिर दूसरे मुख्य पर (मुख्य से) कॉपी करना होगा विषय शाखा) या तो रिबासिंग या चेरी-पिकिंग द्वारा।

रिबासिंग केवल उस शाखा पर काम करता है जिसमें पहले से ही कमिट हैं, इसलिए आपको हर बार अपनी विषय शाखा को डुप्लिकेट करने की आवश्यकता होती है।

बहुत आसान है चेरी:

git cherry-pick master..topic

तो पूरा क्रम नीचे आ जाएगा:

git reset --hard <latest-commit-to-keep>
git cherry-pick master..topic

जब आपकी विषय-डुप्लिकेट शाखा की जाँच हो गई हो। यह वर्तमान डुप्लिकेट से पहले-चेरी-चुने गए कमिट को हटा देगा, और आपके वर्तमान "डंप" (विभिन्न पूर्वजों) के शीर्ष पर "विषय" में हो रहे सभी परिवर्तनों को फिर से लागू करेगा। यह "वास्तविक" अपस्ट्रीम मास्टर पर एक अलग "डाउनस्ट्रीम" मास्टर का उपयोग करते हुए अपने विकास को आधार बनाने के लिए एक उचित रूप से सुविधाजनक तरीका लगता है यह जांचने के लिए कि क्या आपके स्थानीय परिवर्तन अभी भी उस पर लागू होते हैं। वैकल्पिक रूप से आप बस एक अंतर उत्पन्न कर सकते हैं और फिर इसे किसी भी गिट स्रोत के पेड़ के बाहर लगा सकते हैं। लेकिन इस तरह आप एक अप-टू-डेट संशोधित (पैच) संस्करण रख सकते हैं जो आपके वितरण के संस्करण पर आधारित है जबकि आपका वास्तविक विकास वास्तविक अपस्ट्रीम मास्टर के खिलाफ है।

तो बस प्रदर्शित करने के लिए:

  • रीसेट आपकी शाखा को एक अलग कमिट के लिए बना देगा (- पिछले कमिट को भी जांचता है, --soft इंडेक्स में जोड़े गए फ़ाइलों को रखता है (यदि आप फिर से प्रतिबद्ध होंगे तो) और डिफ़ॉल्ट (--mixed) नहीं होगा पिछली प्रतिबद्धता देखें (अपने स्थानीय परिवर्तनों को मिटाते हुए) लेकिन यह सूचकांक को साफ कर देगा (अभी तक कुछ भी नहीं जोड़ा गया है)
  • आप किसी शाखा को एक अलग वचनबद्ध करने के लिए बाध्य कर सकते हैं
  • आप ऐसा करते हुए तुरंत जांच कर सकते हैं कि क्या यह भी प्रतिबद्ध है
  • आपकी वर्तमान शाखा में मौजूद कमिट पर काम करता है
  • चेरी-पिकिंग का मतलब एक अलग शाखा से कॉपी करना है

आशा है कि यह किसी की मदद करता है। मैं इसे फिर से लिखना चाहता था, लेकिन मैं अब प्रबंधन नहीं कर सकता। सादर।


0

मेरे लिए काम करने के बाद, सभी स्थानीय प्रतिबद्ध परिवर्तन हटा दिए गए हैं और स्थानीय को दूरस्थ मूल / मास्टर शाखा के समान रीसेट कर दिया गया है।

git रीसेट - भार उत्पत्ति

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