गलत शाखा को धक्का


99

कुछ 'कमिट', और 'पुश' के एक जोड़े के बाद, git के साथ काम करना, मुझे एहसास हुआ कि मैं गलत शाखा का उपयोग कर रहा हूँ!

अब मुझे किसी तरह से गलत_ब्रांच और कमिटमेंट में अपने बदलावों को हटाना होगा और राइट_ब्रांच में बदलावों को आगे बढ़ाना होगा

ऐसा करने का सबसे अच्छा (और सरल) तरीका क्या है?

धन्यवाद



अच्छा सवाल @tokland: रूबी डेवलपर्स के 99% git का उपयोग करते हैं, और मैं जिस परियोजना में काम कर रहा हूं वह RoR में है ... लेकिन मुझे पता है कि यह एक अच्छी प्रेरणा नहीं हो सकती है
एलेसेंड्रो डी सिमोन

3
मेरे दृष्टिकोण से, यह कोई आधा-टिप्पणी नहीं है, क्योंकि यह कमेंट को दूसरी शाखा में ले जाने के बारे में है, न केवल उन्हें हटाने के बारे में।
ऑलेंज़

जवाबों:


142

उस शाखा पर जाएँ, git logऔर git revertउन लोगों की व्यक्तिगत जाँच करें । एक बार जब आप ऐसा कर लेते हैं, तो वांछित शाखा में वापस आ जाते हैं और फिर आप git cherry-pickजीआईटी रेफरी से विशिष्ट कमेंट्स लेने के लिए उपयोग कर सकते हैं और इसे सही शाखा में विलय कर सकते हैं।

git checkout wrong_branch
git revert commitsha1
git revert commitsha2
git checkout right_branch
git cherry-pick commitsha1
git cherry-pick commitsha2

यदि कमिट्स को एक साथ रखा जाता है और आपके गंदे कमिट्स के बाद कोई भी कमिट नहीं किया जाता है, तो आप git resetउस गलत ब्रांच को अपने स्टेट्स git cherry-pickपर आने से ठीक पहले इस्तेमाल कर सकते हैं और फिर अपने कमिट्स को सही ब्रांच में लाने के लिए फिर से इस्तेमाल कर सकते हैं।

git checkout wrong_branch
git reset commitsha3 #commit just before commitsha2
git checkout right_branch
git cherry-pick commitsha1
git cherry-pick commitsha2

रिवर्ट + चेरी-पिक अन्य संभावित तरीकों की तुलना में बहुत सरल लगता है जिसमें सिर को रीसेट करना और / या रिबासिंग शामिल है।
क्रिसवी

2
Git चेरी-पिक के लिए आप एक ही लाइन में कई शोज़ लगा सकते हैं, अर्थात git cherry-pick commitsha1 commitsha2
थॉमसडब्ल्यू २

Lifesaver! और जटिल नहीं। धन्यवाद!
क्रेग सिल्वर

क्या होता है जब आप गलत_ब्रांच (जैसे विकास) को राइट_ब्रांच (जैसे फीचर / एक्स) में मर्ज करना चाहते हैं, तो आप उन बदलावों को प्राप्त कर लेते हैं, जिन्हें आपने चेरी में उठाया था।
टिब्बी 33

revertइतना क्लीनर और कम से कम नाटकीय है reset, जब तक आप वास्तव में कुछ संवेदनशील हटाना चाहते हैं (साख?)
Qumber

3

सबसे सरल तरीका उपयोग कर रहा है git rebase। मान लीजिए कि आपके पास वह सेटिंग है:

A -- B -- C -- C1 -- C2 # right branch
          \
           \-- D -- C3 -- C4 # wrong branch

आप परिवर्तन C3, C4 को दाईं शाखा में ले जाना चाहते हैं।

git checkout -b new_wrong_branch D
git checkout wrong_branch
git rebase D --onto right_branch
git checkout right_branch
git merge right_branch wrong_branch
git branch -d wrong_branch
git branch rename new_wrong_branch wrong_branch

अब सेटिंग है

A -- B -- C -- C1 -- C2 -- C3 -- C4 # right_branch
          \
           \ -- D # wrong_branch

फिर आपको अपने परिणामों को बल के साथ धकेलना होगा (यदि किसी ने आपके दूरस्थ रेपो के साथ अभी तक तालमेल नहीं किया है):

git push -f remote:right_branch

मैंने इस समाधान की कोशिश नहीं की है, मैं पहले से ही पहले जवाब में काम कर रहा था (और यह काम किया)। मैंने रिबेस पर नहीं सोचा है, यह एक अच्छा विकल्प लगता है, धन्यवाद
Alessandro De Simone

1
इसके बजाय git push -f, बेहतर उपयोग git push --force-with-lease। कम से कम, यह सुनिश्चित करता है कि दूरस्थ रेफरी केवल तभी अपडेट किया जाएगा जब कोई भी आपके कमिट्स के शीर्ष पर अन्य कमिट्स को धक्का न दे।
पियरे-ओलिवियर वेर

2

ध्रुव के जवाब में थोड़ा सा शॉर्टकट

git checkout wrong_branch
git revert commitsha1

git checkout right_branch
git push right_branch

git checkout wrong_branch
git reset commitsha2 #commit just before commitsha1
git push wrong_branch -f
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.