हटाएं Git की एक शाखा से


3230

मैं जानना चाहूंगा कि किसी कमिट को कैसे हटाया जाए।

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

मैं मदद पढ़ता हूं, और मुझे लगता है कि मुझे जो कमांड का उपयोग करना चाहिए वह है git reset --hard HEAD। क्या ये सही है?


41
मुझे लगता है कि यह पिछले कमिट का एक डुप्लिकेट नहीं है क्योंकि यह पूछता है कि किसी शाखा से किसी भी कमिट को कैसे हटाया जाए । मुझे भी लगता है कि गैर जवाब वास्तव में इस सवाल का समाधान है। वे सभी पिछले प्रतिबद्ध पीछे करने, नहीं और एक भी है कि कुछ समय पहले हुआ हो सकता है के लिए प्रतिबद्ध। cherry-pickdelete
क्रिस

12
@ क्रिस, इस सवाल का जवाब git rebase -i HEAD~10प्रश्न के रूप में देता है, क्योंकि यह आपको मनमाने ढंग से हटाने के लिए कमिट करता है। Git उस सीमा पर लागू होता है, जिस सीमा में आप एक-एक करके निर्दिष्ट करते हैं, लॉग से हटाए गए कमिट्स को अनदेखा करना। मैंने आज इस आदेश का उपयोग दूसरे और तीसरे सबसे हाल के छुटकारा पाने के लिए अपने रेपो में शीर्ष पर रहते हुए किया। मैं मानता हूं कि अन्य कोई भी उत्तर संतोषजनक नहीं है।
एमएसटी

@MST हाँ, मुझे कहना चाहिए था, इस प्रश्न के स्वीकृत उत्तर में विकल्पों में से कोई भी विकल्प नहीं है, लेकिन आप बिल्कुल सही हैं - यह आदेश काम करने लगता है
क्रिस

जवाबों:


4122

सावधान: git reset --hard आपका काम करने का तरीका बदल जाएगा । इस आदेश को चलाने से पहले आप जो भी स्थानीय परिवर्तन करना चाहते हैं, उन्हें रोकना सुनिश्चित करें ।

मान लें कि आप उस प्रतिबद्ध पर बैठे हैं, तो यह आदेश इसे मिटा देगा ...

git reset --hard HEAD~1

HEAD~1सिर से पहले प्रतिबद्ध का मतलब है।

या, आप इसके आउटपुट को देख सकते हैं git log, उस कमिट आईडी का पता लगा सकते हैं जिसे आप वापस करना चाहते हैं, और फिर ऐसा करें:

git reset --hard <sha1-commit-id>

यदि आपने पहले से ही इसे धक्का दिया है, तो आपको इससे छुटकारा पाने के लिए एक बल पुश करने की आवश्यकता होगी ...

git push origin HEAD --force

हालांकि , यदि अन्य लोगों ने इसे खींच लिया है, तो आप एक नई शाखा शुरू करने से बेहतर होंगे। क्योंकि जब वे खींचते हैं, तो यह सिर्फ उनके काम में विलीन हो जाएगा, और आप इसे फिर से ऊपर धकेल दिया जाएगा।

यदि आपने पहले से ही धक्का दिया है, तो git revert"दर्पण छवि" बनाने के लिए उपयोग करना बेहतर हो सकता है , जो परिवर्तनों को पूर्ववत कर देगा। हालांकि, दोनों कमिट लॉग में होंगे।


FYI करें - git reset --hard HEADबहुत अच्छा है अगर आप PROGRESS में WORK से छुटकारा पाना चाहते हैं। यह आपको सबसे हालिया प्रतिबद्ध पर वापस लौटा देगा, और आपके काम करने वाले पेड़ और सूचकांक में सभी परिवर्तनों को मिटा देगा।


अंत में, यदि आपको कोई ऐसा कमिटमेंट ढूंढने की जरूरत है जिसे आपने "डिलीट" किया हो, तो यह आम तौर पर git reflogतब तक मौजूद रहता है जब तक कि आपने कचरा अपने रिपॉजिटरी में जमा नहीं कर लिया हो।


59
HEAD~1या बस HEAD^। यदि आपने धक्का दिया, तो आपको git revertइसके बजाय उपयोग करना चाहिए ।
जकूब नारबस्की

13
जाहिर है आप अपने सिर से HEAD~n"वापस जाना" का उपयोग भी कर सकते हैं n। हो सकता है कि इस बिंदु से आपको कार्य के ... --hard HEADरूप में भी व्याख्या की जा सके HEAD~0
नुआल

13
@ bearider9 imho git rebase लगभग हमेशा कमिट को डिलीट करने का बेहतर तरीका है (जैसा कि ग्रेग हेवगिल के उत्तर में वर्णित है) - कम से कम नहीं क्योंकि रिबेस वास्तव में एक बड़ी चेतावनी शामिल करता है कि आप सामान को 4realz हटा रहे होंगे।
नूह ससमान

20
हालांकि यह कमिट ट्री से परिवर्तन नहीं हटाता है। ओपी ने पहले से बनी कमेटी के लिए कहा। यदि आप reset --hard, और जाँच करते हैं log --oneline --all, तो कमिट्स अभी भी पेड़ में बने हुए हैं। हम पेड़ से इन कमिट्स को कैसे हटाते हैं? धन्यवाद।
इब्बानम

17
reset --softस्थानीय प्रगति को नष्ट करने के लिए उपयोग प्रगति में काम के बिना!

704

यदि आपने अभी तक कहीं भी कमिट को धक्का नहीं दिया है, तो आप git rebase -iउस कमिट को हटाने के लिए उपयोग कर सकते हैं । सबसे पहले, पता करें कि वह कितनी दूर है (लगभग)। फिर करो:

git rebase -i HEAD~N

~Nसाधन पिछले rebase Nकरता ( Nउदाहरण के लिए, एक संख्या होनी चाहिए HEAD~10)। उसके बाद, आप उस फ़ाइल को संपादित कर सकते हैं जिसे Git आपके सामने प्रस्तुत करने वाली टिप्पणी को हटाने के लिए प्रस्तुत करता है। उस फ़ाइल को सहेजने पर, Git तब सभी निम्नलिखित कमिट्स को फिर से लिखेगा जैसे कि आपके द्वारा हटाया गया कोई मौजूद नहीं था।

Git Book में चित्रों और उदाहरणों के साथ पुनर्लेखन पर एक अच्छा खंड है

हालांकि इस के साथ सावधान रहें, क्योंकि अगर आप कुछ है कि आप को बदलने की है कहीं और धक्का दे दिया, एक और दृष्टिकोण की आवश्यकता होगी जब तक आप एक बल धक्का करने की योजना बना रहे हैं।


2
नोट: यदि आपके पास कमिट्स के उस अंतिम बैच में कोई भी -नो-एफएफ मर्ज होता है, तो रिबेट कसाई उन्हें भेज देगा :( यह इस पृष्ठ पर -p के तहत उल्लेख किया गया है । समस्या यह है, यदि आप -i के साथ -p को प्रतिस्थापित करते हैं, तो अब आप "इस वचन को संपादित करें, वर्गुश कि एक", आदि के लिए विकल्पों के साथ पॉप अप करें। किसी को भी समाधान पता है?
बुकोव

4
अगर आपने इसे धक्का दिया है तो क्या होगा? (बस मुझे रिमोट रेपो का उपयोग करते हुए)
कोस्टा

6
@ कोस्टा आप push -fपुश को बल देने के लिए और दूरस्थ शाखा को अपने स्थानीय के साथ बदलने के लिए उपयोग कर सकते हैं । अगर यह सिर्फ अपना रिमोट रेपो है, तो कोई बात नहीं। मुसीबत तब शुरू होती है जब किसी और ने इस बीच भ्रूण लिया हो।
ग्रेग हेविगिल

3
मैंने जोड़ा और एक डेटा फ़ाइल बनाई जो कि GitHub के लिए बहुत बड़ी थी (हाँ, यह शायद स्रोत रेपो में वैसे भी नहीं होना चाहिए; ओह अच्छी तरह से)। जब मैंने धक्का देने की कोशिश की, तो बहुत बड़ी फाइल के कारण गिटहब ने मना कर दिया। मैं यह सब करना चाहता था, जबकि कुछ अन्य असंबंधित कमिट को सहेजने के बाद यह एक प्रतिबद्ध था। git rebase -i HEAD~5आदेश था वास्तव में मैं क्या पूरी तरह से यह मेरी स्थानीय रेपो से प्रतिबद्ध दूर करने के लिए की जरूरत है! धन्यवाद!
एल्डो

4
@ डंबल्डड: rebase -iहटाए गए कमिट के अनुरूप परिवर्तन संरक्षित नहीं हैं।
ग्रेग हेवगिल

517

एक और संभावना मेरे व्यक्तिगत पसंदीदा आदेशों में से एक है:

git rebase -i <commit>~1

यह -iउस बिंदु पर इंटरएक्टिव मोड में पुन: प्रारंभ करना शुरू कर देगा , जिससे आप कमिट करना चाहते हैं। संपादक तब से सभी कमिट्स की सूची बनाना शुरू कर देगा। उस पंक्ति को हटा दें जिसमें वह कमिट है जिसे आप फ़ाइल को अनपढ़ और सहेजना चाहते हैं। रीबेस बाकी काम करेगा, केवल उस कमिट को डिलीट करेगा, और बाकी सभी को लॉग में वापस कर देगा।


3
thx, btw अगर आप किसी भी मुद्दे (जैसे खाली कमिट) में चलते हैं, तो आप उपयोग कर सकते हैंgit rebase --continue
realgt

8
और भी आसान: git rebase -i HEAD~1
21

2
Wowzers। git rebase -i HEAD~1वास्तव में रेपो को बहुत साफ किया! यह वास्तव में बताना मुश्किल है कि उसने क्या किया, लेकिन पूरी बात बहुत भद्दी लगती है। थोड़ा खतरनाक, वास्तव में।
चार्ल्स वुड

7
मुझे लगता है कि यह ध्यान देने योग्य है कि यह कम नहीं है, केवल सूची से हटा दिया गया है। यदि आप गड़बड़ करते हैं, तो आप रिफ्लॉग का उपयोग करके कमिट प्राप्त कर सकते हैं ।
ज़ाज़

6
क्या लाइन को डी / ड्रॉप के समान हटाया जा रहा है?
सिंह

344

मैं इस जवाब को जोड़ रहा हूँ क्योंकि मैं यह नहीं देखता कि जिस किसी ने भी काम करने की कोशिश की है, वह Git का उपयोग करके कुछ गलती के कारण उस सारे काम को हटाना चाहेगा!

यदि आप अपना काम और सिर्फ 'पूर्ववत' रखना चाहते हैं, जो कमांड करते हैं (आप रेपो को आगे बढ़ाने से पहले पकड़े गए):

git reset --soft HEAD~1

जब तक आप अंतिम कार्य के बाद से प्रगति में अपने काम को नष्ट नहीं करना चाहते , --हार्ड ध्वज का उपयोग न करें


5
यहाँ एक उदाहरण है कि क्यों: आप एक विकास सर्वर पर एक छोटा सा काम करते हैं जो आप करते हैं। फिर यह पता चलता है कि उस सर्वर में निवर्तमान HTTPS का उपयोग नहीं है, इसलिए आप कहीं भी प्रतिबद्ध नहीं कर सकते। सबसे आसान यह दिखावा करने के लिए कभी नहीं हुआ, और अपने स्थानीय मशीन से पैच को फिर से करें।
स्टीव बेनेट

1
@ कार्तिकबोस हमेशा रिफ्लेक्ट होता। git reset --hard HEAD~1आपकी पिछली नवीनतम प्रतिबद्धताओं के बाद भी रिफ्लॉग (जब तक आप इसे समाप्त नहीं करेंगे) के माध्यम से उपलब्ध होंगे; यहां भी देखें: gitready.com/intermediate/2009/02/09/09/…
कोडिंग'

4
धन्यवाद। इस उत्तर को उच्च श्रेणी में रखा जाना चाहिए या स्वीकृत उत्तर में शामिल होना चाहिए। एक कमिट हटाना!
Alsciende

2
@ रैंडोल्फ क्वार्टर: आप अभी भी किसी भी अनपेक्षित परिवर्तन को खो देंगे।
naught101

7
@ रब, एक उदाहरण है जब आप गलती से एक फ़ाइल बनाते हैं जिसमें एक गुप्त (जैसे एक पासवर्ड) होता है जो कभी भी स्रोत नियंत्रण में नहीं होना चाहिए। स्थानीय प्रतिबद्ध को नष्ट कर दिया जाना चाहिए , न कि केवल पूर्ववत, इसलिए यह सर्वर को कभी भी धक्का नहीं देगा।
बॉब मेयर्स

141

पूरी कमिटमेंट निकालना

git rebase -p --onto SHA^ SHA

स्पष्ट रूप से "एसएचए" को उस संदर्भ से बदलें जिसे आप छुटकारा चाहते हैं। उस कमांड में "^" शाब्दिक है।

http://sethrobertson.github.io/GitFixUm/fixup.html#change_deep


26
मैं इस उत्तर को कैसे बढ़ा सकता हूं ??? अन्य समाधान सिर्फ यह दिखा रहे हैं कि इसे कैसे करना है या शीर्ष कमियों को दूर करना है।
रिबमार

5
-p, --preserve-merges मर्ज मर्ज शुरू करने के बजाय इतिहास को फिर से शुरू करने के बजाय एक मर्ज कमिट शुरू करता है। मर्ज संघर्ष प्रस्तावों या मैनुअल संशोधनों को मर्ज करने के लिए संरक्षित नहीं किया जाता है।
बजे

5
यह वास्तविक सटीक उत्तर है
हम्मन सैमुअल

9
इसमें कहा गया है, "SHA को उस संदर्भ से बदलें जिसे आप छुटकारा पाना चाहते हैं" लेकिन रेखा के पास दो बार SHA है। मैंने जो किया था यह रहा। git rebase -p - Santiago 5ca8832c120 ^ 5ca8832c120 लेकिन कुछ भी नहीं बदला। क्या मैं एक ही SHA का उपयोग दो बार करने वाला हूं? यदि नहीं, तो हटाने के लिए एसएचए कौन सा है और अन्य एसएचए क्या माना जाता है?
रुबिक्समैन

3
वाह, यह निर्दोष काम किया! यह स्वीकृत उत्तर होना चाहिए!
लिरन एच।

51

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

$ git reset --hard HEAD^

(ध्यान दें कि इससे सभी अनकम्यूटेड परिवर्तन भी हो जाएंगे; देखभाल के साथ उपयोग करें)।

यदि आप पहले से ही हटाए जाने के लिए प्रकाशित किए गए हैं, तो git का उपयोग करें

$ git revert HEAD

यह काम नहीं किया। जब मैं लॉग करता हूं, तो सब कुछ अभी भी है, कोई फर्क नहीं पड़ता कि मैं ऐसा क्यों करता हूं और अधिक हिट जोड़ता है। मैं इतिहास को साफ करना चाहता हूं।
कोस्टा

@ कोस्टा: क्या काम नहीं किया (यानी आप किस संस्करण का उपयोग करते हैं), और आपने लॉग कैसे किया?
जकूब नारबस्की

मैंने इस Q & A पर लगभग सब कुछ आज़माया है। (मैंने सबसे पहले हाल ही में जीआईटी को वापस लाने की कोशिश की) मेरा गिट लॉग:tree = log --all --graph --format=format:'%C(bold blue)%h%C(reset) %C(dim black)%s%C(reset)%C(bold red)%d%C(reset) %C(green)by %an, %ar%C(reset)'
कोस्टा

1
मैं सिर्फ कमिट्स को हटाना चाहता हूं (जैसे कि वे कभी अस्तित्व में नहीं थे)। मैं कुछ अजीब कोडिंग साहसिक पर चला गया, कई नए हिट के साथ, और यह सब कचरा समाप्त हो गया। मैं अपने git लॉग से कैसे मिटा सकता हूँ?
कोस्टा

2
पवित्र बकवास कुछ जादुई था जो मैं चाहता था .... जो उन आदेशों में से एक ने किया? !!?
कोस्टा

44

मान लीजिए कि हम रेपो से 2 और 4 के कमिट्स को हटाना चाहते हैं।

commit 0 : b3d92c5
commit 1 : 2c6a45b
commit 2 : <any_hash>
commit 3 : 77b9b82
commit 4 : <any_hash>

नोट: जब से आप उपयोग कर रहे हैं और आपके पास रेपो पर व्यवस्थापक अधिकार होने की आवश्यकता है--hard-f

  • git checkout b3d92c5 अंतिम प्रयोग करने योग्य प्रतिबद्धता की जाँच करें।
  • git checkout -b repair काम करने के लिए एक नई शाखा बनाएँ।
  • git cherry-pick 77b9b82 प्रतिबद्ध 3 के माध्यम से चलाएं।
  • git cherry-pick 2c6a45b भाग 1 के माध्यम से।
  • git checkout master चेकआउट मास्टर।
  • git reset --hard b3d92c5 अंतिम उपयोग करने योग्य प्रतिबद्ध करने के लिए मास्टर रीसेट करें।
  • git merge repair मास्टर पर हमारी नई शाखा मर्ज करें।
  • git push -f origin master दूरस्थ रेपो में मास्टर पुश करें।

1
अंतिम चरण होना चाहिए git push -f origin masterकोई विकल्प नहीं है--hard
विवेक्स

2
मुझे लगता commit 0है कि उम्र से अधिक है commit 1। कृपया मुझे बता सकते हैं कि पहले commit 3(चेरी-पिक के माध्यम से ) और फिर रन क्यों commit 1? की चेकआउट के बाद b3d92cd( commit 0) मैं चेरी लेने उम्मीद होती है commit 1, तो commit 3। धन्यवाद।
जारेक सी

@JarekC मुझे लगता है कि शीर्ष-सबसे प्रतिबद्ध यहां सबसे नई प्रतिबद्धता है, जब तक कि मैं कुछ गलत नहीं देख रहा हूं ...
जेफ Huijsmans

41
git reset --hard commitId

git push <origin> <branch> --force

पुनश्च: कमिट एक को संदर्भित करता है जिसे आप वापस करना चाहते हैं


git धक्का - प्रवर्तन <मूल> <शाखा नाम>। शाखा नाम के उल्लेख के बिना यह रिमोट पर सभी फ़ाइल को बदल सकता है।
शीलप्रिया

39

बलपूर्वक इतिहास बदलें

यह मानते हुए कि आप केवल अंतिम कमिट को हटाना नहीं चाहते हैं, लेकिन आप अंतिम n कमिट के विशिष्ट कमिट्स को हटाना चाहते हैं, साथ जाएं:

git rebase -i HEAD~<number of commits to go back>, इसलिए git rebase -i HEAD~5यदि आप अंतिम पांच देखना चाहते हैं।

तब पाठ संपादक में शब्द बदलने pickके लिए dropहर प्रतिबद्ध करने के लिए आप निकालना चाहते हैं अगले। सहेजें और संपादक को छोड़ दें। देखा!

Additively इतिहास बदलें

कोशिश करो git revert <commit hash>रिवर्ट एक नया कमिट बनाएगा जो निर्दिष्ट कमिट को पूर्ववत् करता है।


dropकीवर्ड परिभाषित नहीं है। कमिट हटाने के लिए पूरी लाइन हटा दें।
शयन सालेहियन

1
मेरे लिए ड्रॉप को एक कीवर्ड के रूप में परिभाषित किया गया था, लेकिन एक ड्रॉप करने से इतिहास से कमिट नहीं लगता है। हालांकि इंटरएक्टिव रिबेस से लाइन हटा दी।
एडम पार्किंन

मुझे ठीक इसी की आवश्यकता थी। बहुत अच्छा काम करता है; धन्यवाद!
डाइकुनस्टेडरफ्यूज

30

यदि आप अपनी नवीनतम कमिट को ठीक करना चाहते हैं, तो आप कमिट को पूर्ववत् कर सकते हैं, और इसमें फ़ाइलों को अनस्टेज कर सकते हैं:

git reset HEAD~1

यह फ़ाइलों को मंचित करने वाले आदेशों को जोड़ने से पहले आपकी रिपॉजिटरी को उसके राज्य में लौटा देगा। आपके परिवर्तन आपकी कार्यशील निर्देशिका में होंगे। HEAD ~ 1 शाखा के वर्तमान सिरे के नीचे की प्रतिबद्धता को दर्शाता है।

यदि आप N कम करना चाहते हैं, लेकिन अपनी कार्यशील निर्देशिका में कोड परिवर्तन रखें:

git reset HEAD~N

यदि आप अपनी नवीनतम कमिट से छुटकारा पाना चाहते हैं, और कोड में बदलाव नहीं रखना चाहते हैं, तो आप "हार्ड" रीसेट कर सकते हैं।

git reset --hard HEAD~1

इसी तरह, यदि आप अंतिम N को छोड़ना चाहते हैं, और कोड परिवर्तन नहीं रखना चाहते हैं:

git reset --hard HEAD~N

22
git rebase -i HEAD~2

यहां '2' उन रीमेट्स की संख्या है, जिन्हें आप रिबेस करना चाहते हैं।

'git rebase -i HEAD`

यदि आप सभी कमिटों को फिर से बनाना चाहते हैं।

तब आप इनमें से किसी एक विकल्प को चुन सकेंगे।

p, pick = use commit

r, reword = use commit, but edit the commit message

e, edit = use commit, but stop for amending

s, squash = use commit, but meld into previous commit

f, fixup = like "squash", but discard this commit's log message

x, exec = run command (the rest of the line) using shell

d, drop = remove commit

इन पंक्तियों को फिर से आदेश दिया जा सकता है; उन्हें ऊपर से नीचे तक क्रियान्वित किया जाता है। यदि आप यहां से एक लाइन हटाते हैं, तो यह कम होगा। हालांकि, यदि आप सब कुछ हटा देते हैं, तो रिबास निरस्त कर दिया जाएगा। ध्यान दें कि खाली कॉमेंट पर टिप्पणी की जाती है

आप बस "d" विकल्प का उपयोग करके उस कमिट को हटा सकते हैं या अपनी प्रतिबद्ध लाइन को हटा सकते हैं।


नवीनतम git संस्करण में d अधिक विकल्प नहीं है । आपको उन्हें हटाने के लिए रीबेज़ से आने वाली लाइनों को हटाने की आवश्यकता है।
ओलेग अब्राजेव

17

स्थानीय शाखा में हटाने के लिए, उपयोग करें

git reset --hard HEAD~1

किसी दूरस्थ शाखा में हटाने के लिए, उपयोग करें

git push origin HEAD --force

12

[शीघ्र जवाब]

आपके पास कई विकल्प हैं, उदाहरण के लिए:

  • वैकल्पिक 1:

    git rebase -i <YourCommitId>~1
    

    आप जो वापस करना चाहते हैं, उस संख्या के लिए YourCommitId को बदलें।

  • वैकल्पिक 2:

    git reset --hard YourCommitId
    git push <origin> <branch> --force
    

    आप जो वापस करना चाहते हैं, उस संख्या के लिए YourCommitId को बदलें।

    मैं इस विकल्प की अनुशंसा नहीं करता क्योंकि आप अपना कार्य प्रगति पर छोड़ सकते हैं।

  • वैकल्पिक 3:

    git reset --soft HEAD~1
    

    आप अपना काम रख सकते हैं और केवल प्रतिबद्ध को पूर्ववत कर सकते हैं।


थैंक्यू थैंक्यू थैंक्यू थैंक्यू (वाई)
हबीब रहमान

11

स्रोत: https://gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf229166cf79d8

अंतिम प्रतिबद्ध हटाएं

उदाहरण के लिए आपका अंतिम वचन

git पुश ओरिजिन + आ61ab32 ^: मास्टर

अब आप इस कमिट को डिलीट करना चाहते हैं, इसके बाद एक आसान तरीका

कदम

  1. पहले वर्तमान प्रतिबद्ध के माता-पिता को शाखा रीसेट करें

  2. बल-इसे दूर तक धकेलो।

git reset HEAD^ --hard

git push origin -f

विशेष प्रतिबद्धता के लिए, आप रीसेट करना चाहते हैं

git reset bb676878^ --hard

git push origin -f

9

यहाँ यह करने का एक और तरीका है:

उस शाखा को चेकआउट करें जिसे आप वापस करना चाहते हैं, फिर अपनी स्थानीय कार्य प्रतिलिपि को उस प्रतिबद्ध पर वापस रीसेट करें जिसे आप दूरस्थ सर्वर पर नवीनतम होना चाहते हैं (इसके बाद सब कुछ बाय-बाय हो जाएगा)। ऐसा करने के लिए, SourceTree में मैंने "इस प्रतिबद्ध के लिए BRANCHNAME को रीसेट करें" पर राइट-क्लिक किया। मुझे लगता है कि कमांड लाइन है:

git reset --hard COMMIT_ID

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

फिर अपनी रिपॉजिटरी की स्थानीय निर्देशिका पर जाएँ और इस कमांड को चलाएँ:

git -c diff.mnemonicprefix=false -c core.quotepath=false \
push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME

यह आपके स्थानीय भंडार में वर्तमान एक के बाद सभी कमियों को मिटा देगा लेकिन केवल उस एक शाखा के लिए।


9

भूल:

मैं git rebase -i --rootअपनी शाखा को संपादित कर रहा हूं, यह सोचकर कि मैं मास्टर से अलग होने वाली पहली प्रतिबद्धताओं को पुन: प्राप्त कर सकता हूं ( विंडोज डिफ़ॉल्ट दृश्य के लिए गीथहब मास्टर की तुलना है, यह संपूर्णता छिपाता है)।

मैंने एक सिलिकॉन वैली दाढ़ी बढ़ाई, जबकि 900+ कमिट्स ने खुद को सबलाइम में लोड किया। बिना किसी परिवर्तन के साथ, मैंने अपनी बैटरी चार्ज की और फिर दाढ़ी बनाने के लिए आगे बढ़ा, जैसा कि सभी 900+ व्यक्ति अब तक किए गए अपने समय को फिर से रीसेट करते हुए गैर-कानूनी रूप से विद्रोह करते हैं।

गिट को हराने और मूल समय को संरक्षित करने के लिए दृढ़ संकल्प, मैंने इस स्थानीय रिपॉजिटरी को हटा दिया और रिमोट से फिर से क्लोन किया।

अब मैंने इसे हटाने के लिए कामना करने वाले स्वामी को एक सबसे हाल ही में अनावश्यक रूप से पुन: जोड़ा था, इसलिए आगे बढ़ गया।

विकल्पों को छोड़ना:

मैं नहीं चाहता था git revert- यह एक अतिरिक्त प्रतिबद्धता पैदा करेगा, जिससे ऊपरी हाथ मिल जाएगा।

git reset --hard HEADकुछ भी नहीं किया, reflogआखिरी की जाँच के बाद , केवल और केवल HEADक्लोन था - गिट जीत।

सबसे हाल ही में SHA पाने के लिए, मैंने github.com पर रिमोट रिपॉजिटरी की जाँच की - मामूली जीत।

सोचने के बाद git reset --hard <SHA>काम किया था, मैंने एक और शाखा को मास्टर और 1 ... 2 ... पूफ को अपडेट किया! प्रतिबद्ध वापस आ गया था - जीत जीत।

मास्टर के लिए वापस जाँच करना, कोशिश करने का समय git rebase -i <SHA>, फिर लाइन को हटा दें ... कोई फायदा नहीं हुआ, दुख की बात है। " यदि आप यहाँ एक लाइन हटाते हैं तो कम से कम होगा "। आह ... 2.8.3 के रिलीज नोटों में n00b को ट्रोल करने वाले नए फीचर पर काम किया ।

समाधान:

git rebase -i <SHA>तब d, drop = remove commit

सत्यापित करने के लिए, मैंने एक और शाखा, और वॉइला की जाँच की - मास्टर से लाने / खींचने के लिए कोई छिपाना नहीं।

https://twitter.com/holman/status/706006896273063936

आपका अच्छा दिन हो।


8

ऊपर दिए गए सभी आदेश आपके काम के पेड़ और सूचकांक की स्थिति को बहाल करते हैं क्योंकि वे कमिट करने से पहले थे, लेकिन रिपॉजिटरी की स्थिति को बहाल नहीं करते हैं। यदि आप इसे देखते हैं, तो "हटाए गए" कमिट को वास्तव में हटाया नहीं जाता है, यह बस वर्तमान शाखा के सिरे पर एक नहीं है।

मुझे लगता है कि चीनी मिट्टी के बरतन आदेशों के साथ एक कमिट निकालने का कोई साधन नहीं है । एकमात्र तरीका यह है कि इसे लॉग से हटा दिया जाए और फिर से भरा जाए और फिर निष्पादित किया जाए git prune --expire -now


1
जिस क्रम में StackOverflow पर उत्तर दिखाए गए हैं, वह निश्चित नहीं है। कृपया "उपरोक्त सभी आदेशों" का संदर्भ न दें। अपने उत्तर को स्व-निहित करें।
पास्कल क्यूक

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

8

यदि आप इतिहास रखना चाहते हैं, तो कमिट और रिवर्ट दिखाते हुए, आपको उपयोग करना चाहिए:

git revert GIT_COMMIT_HASH

यह समझाते हुए संदेश दर्ज करें कि आप फिर से क्यों कर रहे हैं:

git push  

जब आप जारी git logकरते हैं तो आप दोनों "गलत" कमिट देखेंगे और लॉग संदेशों को वापस लाएंगे।


हां, लेकिन ओपी स्पष्ट था कि यह वही नहीं है जो वे चाहते हैं।
स्टीव बेनेट

7

यदि आपने अभी-अभी अपनी अंतिम प्रतिबद्ध (गलत संदेश, कुछ बदलावों को जोड़ना भूल गए) को गड़बड़ किया है और इसे सार्वजनिक रेपो में उपयोग करने से पहले इसे ठीक करना चाहते हैं तो इसका उपयोग क्यों न करें:

git commit --amend -m "New message here"

यदि आपके पास नए चरणबद्ध परिवर्तन हैं, तो उन्हें अंतिम प्रतिबद्ध के साथ जोड़ा जाएगा (जो आप छुटकारा पाने की कोशिश कर रहे हैं) और उस प्रतिबद्ध को बदल देगा।

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

आप '-m-edit' विकल्प को '-m' के बजाय पास कर सकते हैं यदि आप पिछली प्रतिबद्ध संदेश का उपयोग करना चाहते हैं।

डॉक्स: http://git-scm.com/docs/git-commit.html


2
यही नहीं ओपी पूछ रहा है।
स्टीव बेनेट

5

यदि आपने पहले ही धक्का दे दिया है, तो सबसे पहले उस प्रतिबद्धता को खोजें जो आप HEAD ($ GIT_COMMIT_HASH_HERE) पर करना चाहते हैं , फिर निम्नलिखित को चलाएँ:

git reset --hard $GIT_COMMIT_HASH_HERE
git push origin HEAD --force

फिर प्रत्येक स्थान पर रेपो को क्लोन किया गया है, चलाएं:

git reset --hard origin/master

5

जब मैं प्रतिबद्ध करता हूं और धक्का देता हूं तो आम तौर पर मैं क्या करता हूं (यदि किसी ने अपनी प्रतिबद्धता को आगे बढ़ाया तो समस्या हल हो जाएगी):

git reset --hard HEAD~1

git push -f origin

उममीद है कि इससे मदद मिलेगी


5

मैंने पहले ही धक्का दे दिया है। कुछ वापस लौटने की जरूरत है। कई बदलावों की कोशिश की है, लेकिन केवल जस्टिन के माध्यम से यह मेरे लिए ठीक काम कर रहा है:

git reset --hard $GIT_COMMIT_HASH_HERE
git push origin HEAD --force

4

स्थानीय शाखा पर रीसेट करें

git reset --hard HEAD~<Number of commit> So git reset --hard HEAD~3

बल को धक्का

git push -f origin

3

अस्थायी फ़ोल्डर में अपने कोड का बैकअप लें। निम्न आदेश सर्वर के समान रीसेट हो जाएगा।

git reset --hard HEAD
git clean -f
git pull

यदि आप अपने परिवर्तनों को रखना चाहते हैं, और हाल के कमिट्स को हटा दें

git reset --soft HEAD^
git pull


2

स्थानीय प्रतिबद्ध हटाएं

जैसा कि आप उपरोक्त चित्र पर देख सकते हैं कि मैं "टेस्ट चेंज 2" को कमिट करना चाहता हूं (SHA1 ID: 015b5220c50e3dfbb1063f23789d92ae1d3481a2 (आप SHA1 ID का उपयोग करके प्राप्त कर सकते हैं)gitk git bash में कमांड )।

इसके लिए मैं उपयोग कर सकता हूं (सभी स्थानीय कमांड के नीचे काम करते हैं। आपको हटाने के बाद पुश करने की आवश्यकता है):

  1. git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2// यह बैक-अप आपको लगता है कि प्रतिबद्ध करने के लिए (के SHA1 आईडी परीक्षण परिवर्तन 4 प्रतिबद्ध है 515b5220c50e3dfbb1063f23789d92ae1d3481a2 )
  2. git reset --hard HEAD~1 // यह एक कमिट से पहले आपको बैक-अप करता है।
  3. git reset --hard HEAD^ // अंतिम प्रतिबद्धता को हटाने के लिए

हटाने के बाद:

हटाने के बाद


2

git reset --hard HEAD~1
अब आप पिछले सिर पर होंगे। शाखा खींचो। नया कोड पुश करें। कमेटी को गिट से हटा दिया जाएगा


जब तक आप पहले से ही बदलावों को आगे नहीं बढ़ाते। उस स्थिति में हार्ड रीसेट आपके रिमोट को साफ नहीं करेगा। उस स्थिति में
रिबास

1

git रीसेट --हार्ड

git पुश ओरिजिन HEAD --फोर्स

यदि एक या अधिक कमिट्स को टैग किया गया है, तो पहले टैग को हटा दें। अन्यथा टैग किए गए कमिट को हटाया नहीं जाता है।


0

git revert का उपयोग करें https://git-scm.com/docs/git-revert । यह सभी कोड को वापस कर देगा फिर आप अगले कमिट कर सकते हैं। फिर हेड उस अंतिम कमिट को इंगित करेगा। रिवर्ट किए गए कमिट कभी भी डिलीट नहीं होते हैं लेकिन यह अंतिम कमिट पर आप पर असर नहीं डालेंगे।


0

मेरे मामले में, इस छात्र के लिए मेरा जादू कोड यह है:

git reset --hard @{u}

इसका परीक्षण करो और मुझे बताओ। मैंने कुछ अलग करने की कोशिश की है, लेकिन यह एक ही था जिसने मेरी मदद की।

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