git - पहली शाखा के बाद एक शाखा की शाखा को विलय करना जब मास्टर में विलय कर दिया जाता है




squash arcanist (2)

यहां एक वर्कफ़्लो है जिसे मैं आमतौर पर काम से निपटता हूं।

git checkout -b feature_branch
# Do some development
git add .
git commit
git push origin feature_branch

इस बिंदु पर फीचर शाखा मेरे सहयोगियों से समीक्षा के लिए है, लेकिन मैं अन्य सुविधाओं पर विकसित करना चाहता हूं जो कि feature_branch पर निर्भर हैं। तो जबकि feature_branch समीक्षा में है ...

git checkout feature_branch
git checkout -b dependent_branch
# Do some more development
git add .
git commit

अब मैं फीचर_ब्रांच पर कोड समीक्षा के जवाब में कुछ बदलाव करता हूं

git checkout feature_branch
# Do review fixes
git add .
git commit
git checkout dependent_branch
git merge feature_branch

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

git checkout feature_branch
git log # Look for hash at beginning of branch
git rebase -i  first_hash_of_branch # Squash feature_branch into a single commit
git merge master

निर्भर_ब्रंच को छोड़कर, सब कुछ शांत है। जब मैं गुरु पर आश्रित शाखा को पुन: स्थापित करने का प्रयास करता हूं या इसमें मास्टर को शामिल करने का प्रयास करता हूं, तो गिट पुन: लिखित / depedendent_branch इतिहास से भ्रमित हो जाता है और मूल रूप से एक संघर्ष के रूप में depedendent_branch में हर एक परिवर्तन को depedendent_branch करता है। यह PITA के माध्यम से जाना है और मूल रूप से depend_branch में सभी परिवर्तनों को फिर से करना या dependent_branch । क्या इसका कोई हल है? कभी-कभी, मैं मैन्युअल रूप से एक पैच बनाऊंगा और इसे मास्टर की एक ताजा शाखा से लागू करूंगा, लेकिन अगर इसके साथ कोई वास्तविक विवाद है, तो इसे ठीक करने के लिए और भी बदतर है।

git checkout dependent_branch
git diff > ~/Desktop/dependent_branch.diff
git checkout master
git checkout -b new_dependent_branch
patch -p1 < ~/Desktop/dependent_branch.diff
# Pray for a clean apply.

कोई विचार? मुझे पता है कि स्क्वैश के दौरान फिर से लिखे गए इतिहास के कारण ऐसा होता है, लेकिन यह एक आवश्यकता है जिसे मैं बदल नहीं सकता। सबसे अच्छा समाधान / समाधान क्या है? क्या कोई जादू है जो मैं कर सकता हूं? या मैन्युअल रूप से अंतर बनाने के साथ जुड़े सभी चरणों को करने का एक तेज़ तरीका है?


इस विशेष मामले में ऐसा लगता है कि आप "जानते" हैं कि आपने जिस शाखा में मूल रूप से काम किया है, उसका केवल स्क्वीस्ड काम ही मास्टर में डाला गया है।

इसलिए हर बार संघर्ष होने पर आप अपने परिवर्तनों को रखकर खुशी-खुशी विलय कर सकते हैं। उसके लिए एक विकल्प है:

git merge -Xours master

अधिक विवरणों के लिए https://git-scm.com/docs/git-rebase देखें।


ऐसा क्यों होता है इसके बारे में थोड़ा सा:

मैं O को "मूल मास्टर" और FB को "नया मास्टर" होने दूंगा, एक फीचर शाखा के विलय के बाद:

कहो feature_branch दिखता है:

O - A - B - C 

depend_feature के शीर्ष पर कुछ अतिरिक्त कमिट हैं:

O - A - B - C - D - E - F

आप अपनी मूल सुविधा शाखा को मास्टर में विलय कर देते हैं और इसे नीचे कर देते हैं:

O - FB

अब, जब आप आश्रित शाखा को रिबेट करने का प्रयास करते हैं, तो git उन शाखाओं के बीच के सामान्य पूर्वजों का पता लगाने की कोशिश करने वाला है। हालांकि यह मूल रूप से C , यदि आपने कमिट्स को स्क्वीज नहीं किया C , तो इसके बजाय O को सामान्य पूर्वज के रूप में पाया जाता है। नतीजतन, गिट A , B और C को फिर से खेलना करने की कोशिश कर रहा C जो पहले से ही FB में निहित हैं, और आप संघर्षों का एक गुच्छा प्राप्त करने जा रहे हैं।

इस कारण से, आप वास्तव में एक विशिष्ट रिबेस कमांड पर भरोसा नहीं कर सकते हैं, और आपको इसके बारे में अधिक स्पष्ट होना --onto

git rebase --onto master HEAD~3  # instruct git to replay only the last
                                 # 3 commits, D E and F, onto master.

अपनी शाखाओं के लिए आवश्यक के रूप में HEAD~3 पैरामीटर को संशोधित करें, और आपको किसी भी अनावश्यक विरोध समाधान से निपटना नहीं चाहिए।

कुछ वैकल्पिक वाक्यविन्यास, यदि आपको निर्दिष्ट श्रेणियां पसंद नहीं हैं और आपने अपनी मूल सुविधा शाखा को अभी तक नहीं हटाया है:

git rebase --onto master feature_branch dependent_feature

                                 # replay all commits, starting at feature_branch
                                 # exclusive, through dependent_feature inclusive 
                                 # onto master




arcanist