git इतिहास से मर्ज हटा दें


97

मेरा गिट इतिहास ऐसा लगता है:

इतिहास गढ़ो

मैं एक एकल में बैंगनी कमिट स्क्वैश करना चाहूंगा। मैं उन्हें कभी भी अपने कमिट लॉग में नहीं देखना चाहता।

मैंने एक करने की कोशिश की है git rebase -i 1, लेकिन भले ही 1वह नीली शाखा (cf. तस्वीर) पर है, फिर भी मैं अपनी बैंगनी शाखा पर हर कमिटमेंट देखता हूं।

मैं बैंगनी शाखा (कमिट लॉग से) को पूरी तरह से कैसे हटा सकता हूं?


क्या आपके रेपो को कहीं और धकेला गया है जो अन्य लोगों ने खींच लिया है?
स्लेइस

दोनों शाखाएँ विशुद्ध रूप से स्थानीय हैं।
बेंजामिन टूएग

जवाबों:


100

क्या git rebase -i <sha before the branches diverged>यह आपको मर्ज कमिट को हटाने की अनुमति देगा और लॉग एक सिंगल लाइन होगी जैसा आप चाहते थे। आप ऐसे किसी भी कमिट को भी डिलीट कर सकते हैं जो आप नहीं चाहते हैं। आपके रीबेस का काम नहीं करने का कारण यह था कि आप बहुत दूर नहीं जा रहे थे।

चेतावनी: आप ऐसा करने वाले इतिहास को फिर से लिख रहे हैं। दूरस्थ रेपो में धकेल दिए गए परिवर्तनों के साथ ऐसा करने से समस्याएँ पैदा होंगी। मैं केवल स्थानीय लोगों के साथ यह करने की सलाह देता हूं।


4
यहां तक ​​कि अगर मैं शाखाओं को
मोड़ने से पहले एक सा चुनता

1
हाँ, तो आप उन्हें उस संपादक में हटा देते हैं जो साथ आता है git rebaseऔर उन्हें हटा दिया जाएगा।
शिले

4
कमियों को हटाने से मर्ज के सभी संशोधन खो गए। लेकिन मैंने एक नरम रीसेट किया और मैं काफी कुछ करने में सक्षम रहा हूं जैसे मैं चाहता था (आदेश प्रारंभिक अपेक्षाओं से मेल नहीं खाता)।
बेंजामिन तोएग

2
यह उत्तर विस्तार से अधूरा है, यू कौन सी शाखा से छूट प्रदान करते हैं?
ग्रा।

3
निश्चित रूप से आप कमिट्स को 'हटाना' नहीं चाहते हैं। 'हटाना' रिबास में एक विकल्प नहीं है, लेकिन हटाना है। यदि आप एक कमिट हटाते हैं, तो आप इसे शुरू किए गए परिवर्तनों को ढीला कर देंगे। आप कमिट्स को स्क्वैश करना चाहते हैं।
Thecoshman

69

मूल राज्य में रेपो के साथ शुरू

मूल रेपो इतिहास

मर्ज कमिट को हटाने के लिए और मेनलाइन में ब्रांच को एक ही कमिट में स्क्वैश करें

स्क्वैस्ड कमिट्स, कोई मर्ज कमिट नहीं

इन आदेशों का उपयोग करें (5 और 1 के स्थान पर संगत कमियों के SHAs के साथ):

git checkout 5
git reset --soft 1
git commit --amend -m '1 2 3 4 5'
git rebase HEAD master

एक मर्ज कमिट को बनाए रखने के लिए, लेकिन शाखा को एक में स्क्वैश करना:

स्क्वैस्ड कमिट्स, मर्ज कमिटमेंट बनाए रखा

इन आदेशों का उपयोग करें (5, 1 और C के स्थानापन्न कमानों के साथ):

git checkout -b tempbranch 5
git reset --soft 1
git commit --amend -m '1 2 3 4 5'
git checkout C
git merge --no-ff tempbranch
git rebase HEAD master

मर्ज कमेटी को हटाने और इसे शाखा से अलग-अलग कमिट के साथ बदलने के लिए

शाखा मेनलाइन में चली गई, कोई मर्ज कमिट नहीं

बस करते हैं (इसी प्रतिबद्ध के SHA के साथ 5 की जगह):

git rebase 5 master

और अंत में, पूरी तरह से शाखा को हटाने के लिए

शाखा पूरी तरह से हटा दी गई

इस कमांड का प्रयोग करें (संबंधित कमिट्स के SHAs के साथ C और D की जगह):

git rebase --onto C D~ master

में git rebase 5 masterमामला है, क्यों नहीं "एबीसी 1 2 3 4 5 डी ..." आदेश है?
रॉय

1
यह कमांड उन कमिट्स को लेती है, जिनके masterपास सामान्य नहीं है 5और उन्हें शीर्ष पर रखता है 5। प्रतिबद्ध में Cके वंश का हिस्सा नहीं है 5, यह पहली की चोटी पर ले जाया जा रहा है 5
एलन लूज

2
यदि आप "एबीसी 1 2 3 4 5 डी ..." के साथ समाप्त करना चाहते हैं ... तो आप कर सकते हैं:git rebase C 5; git rebase 5 master
एलन लूस

16

इससे निपटने के दो तरीके हैं जो आप चाहते हैं:

समाधान 1 : बैंगनी कमिट्स को हटाएं, इतिहास को संरक्षित करना (आपको वापस रोल करना चाहते हैं)

git revert -m 1 <SHA of merge>

-m 1 निर्दिष्ट करता है कि किस मूल पंक्ति को चुनना है

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


समाधान 2 : बैंगनी कमिट्स को पूरी तरह से हटा दें (रेपो साझा होने पर विघटनकारी परिवर्तन)

git rebase -i <SHA before branching out>

और बैंगनी कमिट्स के अनुरूप (हटाएं लाइनें) हटाएं।

मर्ज के बाद कमिट नहीं किए गए तो यह कम मुश्किल होगा। अतिरिक्त आवागमन के दौरान संघर्ष की संभावना बढ़ जाती है revert/rebase


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

@Cupcake, बशर्ते दो अलग-अलग उत्तर थे। पी: मैं जवाब को संशोधित कर कम भ्रमित होने की
प्रेम

AFAIK यह वह नहीं है जो ओपी पूछ रहा है। वह बदलावों को रखना चाहता है, लेकिन अपने लॉग से शोर को हटा देता है। उसके लिए, उसे कमिट्स स्क्वैश करने की जरूरत है, हटाने से परिवर्तन को हटा दिया जाएगा।
Thecoshman

सच है, ऐसा लगता है कि मूल प्रश्न को फिर से परिभाषित किया गया है। यह उत्तर ओपी समस्या के लिए नहीं है।
प्रीमियर

16

बस एक मर्ज कमेट को दूर करने के लिए

यदि आप सब करना चाहते हैं तो एक मर्ज कमेटी (2) को हटा देना है ताकि यह ऐसा हो जैसा कि कभी नहीं हुआ, कमांड इस प्रकार है

git rebase --onto <sha of 1> <sha of 2> <blue branch>

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


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