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


81

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

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

सब कुछ शांत है, सिवाय इसके dependent_branch। जब मैं गुरु पर आश्रित शाखा को पुन: स्थापित करने की कोशिश करता हूं या मास्टर को इसमें शामिल करने का प्रयास करता हूं, तो रिट लिखित / स्क्वैश इतिहास से भ्रमित होता है और मूल depedendent_branchरूप से संघर्ष के रूप में हर एक परिवर्तन को चिह्नित करता है । यह एक PITA है जिसके माध्यम से जाना है और मूल रूप से सभी परिवर्तनों में फिर से संघर्ष करना है 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 add .पूरी तरह से बुराई है, और अंत में आपको काटेगा जब आप उन चीजों को हवा देते हैं जिनका आप मतलब नहीं रखते थे। आप का उपयोग करना चाहिए git add -pया कम से कम से कमgit add -u .
meagar

1
जब आप अपना कोड समीक्षा परिवर्तन कर लेते हैं, तो आपको सुविधा शाखा पर depend_branch को पुन: स्थापित करना चाहिए। फिर जब मास्टर में जाने के लिए तैयार हों, तो मास्टर पर सुविधा शाखा को फिर से शुरू करें, और कमिट स्क्वैश करें और फिर मास्टर में सुविधा शाखा को मर्ज करें।
टिम

जवाबों:


108

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

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

कहते feature_branchहैं:

O - A - B - C 

dependent_feature उसके ऊपर कुछ अतिरिक्त काम करता है:

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

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

O - FB

अब, जब आप आश्रित शाखा को रिबेट करने का प्रयास करते हैं, तो git उन शाखाओं के बीच के सामान्य पूर्वजों का पता लगाने की कोशिश करने वाला है। हालांकि यह मूल रूप से होता C, यदि आपने कमिट्स को नहीं हटाया था, तो इसके बजाय Oसामान्य पूर्वज के रूप में पाया जाता है। नतीजतन, Git पुनः चलाने के लिए कोशिश कर रहा है A, Bऔर 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

मैं यह देखने की उम्मीद कर रहा था कि गुरु का उपयोग करने के लिए git का पेड़ अलग कैसे है। या शायद किसी और तरीके को समझने के लिए कि कैसे -इंतोनो अलग है।
अभिषेक आनंद

3
-इंतोनो बस आपको और अधिक चयनात्मक होने की अनुमति देता है जिसके बारे में आपको लगता है कि आप एक शाखा पर फिर से खेलना चाहेंगे। डिफ़ॉल्ट रूप से, git "यह पता लगाने" की कोशिश करता है कि कौन सा पुनरावृत्त होना चाहिए। जब आप उपयोग करते हैं, तो - आप स्पष्ट रूप से कमिट की एक निश्चित सीमा को फिर से चलाने के लिए गिट को निर्देश देते हैं । मेरे उदाहरण में, यदि आपने --onto का उपयोग नहीं किया है, तो आप O - FB - A - B - C - D - E - F के साथ समाप्त हो जाएंगे और FB और A - B - C के बाद से कई मर्ज टकराव में समान परिवर्तन होंगे। अंतिम 3 कमिट्स का उपयोग करके - सेंटो और निर्दिष्ट करके, आप ओ - एफबी - डी - ई - एफ के साथ समाप्त हो जाते हैं, क्योंकि मूल प्रश्नकर्ता की तलाश थी।
joshtkling

2

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

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

git merge -Xours master

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


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

0

मैं दिल से असहमत हूं "हर सुविधा विकास को एक ही वचनबद्ध नीति में ढाले", लेकिन यह उनका आह्वान है ...

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


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