git - विलय होने पर विशिष्ट लंघन


200

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

मेरी दो शाखाएँ हैं जिन्हें मास्ट 10 (v1 के लिए) और मास्टर 20 (वी 2 के लिए) कहा जाता है। मैं शाखा मास्टर 10 पर v1 में बग फिक्स कर रहा हूं, और मास्टर 20 का नया सामान विकसित कर रहा हूं। जब भी मैं बग फिक्स करता हूं, तो मैं इसे मास्टर 2 की जांच करके और वी 2 में विलय कर देता हूं git merge master10। अब तक सब ठीक है।

हालांकि अब, मैंने v1 में एक बदलाव किया है जो मैं v2 में नहीं चाहता, लेकिन मैं अन्य बग फिक्स को मर्ज करना जारी रखना चाहता हूं। मैं Git को उस विशेष कमिट (या कमिट की एक सीमा) को छोड़ने के लिए कैसे कहता हूं, लेकिन आगे जाकर मैं अभी भी कई बग फिक्स को मर्ज करना चाहता हूं।

मैंने सोचा कि git rebaseहो सकता है कि मुझे क्या चाहिए लेकिन डॉक्टर को पढ़ा और मेरा सिर लगभग फट गया।

मुझे लगता है कि मैं जो चाहता हूं वह "git सिंक" कमांड की तरह कुछ है जो git को बताता है कि दो शाखाएं अब-सिंक में हैं और भविष्य में केवल इस सिंक-पॉइंट से कमिट को मर्ज करती हैं।

किसी भी मदद की सराहना की।

जवाबों:


289

यदि आप सबसे अधिक विलय करना चाहते हैं, लेकिन सभी शाखाएं "मेन्ट" से "मास्टर" तक नहीं हैं, उदाहरण के लिए, आप ऐसा कर सकते हैं। इसके लिए कुछ काम की आवश्यकता है ---- जैसा कि ऊपर बताया गया है, सामान्य उपयोग का मामला शाखा से सब कुछ मर्ज करना है --- लेकिन कभी-कभी ऐसा होता है कि आपने एक रिलीज़ संस्करण में बदलाव किया है जिसे वापस एकीकृत नहीं किया जाना चाहिए (शायद उस कोड का पहले से ही मास्टर में सुपरसीड किया गया है), तो आप उसका प्रतिनिधित्व कैसे करते हैं? यहाँ जाता हैं...

तो चलिए मान लेते हैं कि maint में 5 बदलाव हुए हैं, और उनमें से एक (maint ~ 3) को वापस मास्टर में विलय नहीं किया जाना है, हालांकि अन्य सभी को होना चाहिए। आप इसे तीन चरणों में करते हैं: वास्तव में उस से पहले सब कुछ मर्ज कर देते हैं, बता दें कि maint ~ 3 को तब भी मर्ज किया जा सकता है जब वह नहीं मिला हो, और फिर बाकी को मर्ज कर दें। जादू है:

bash <master>$ git merge maint~4
bash <master>$ git merge -s ours maint~3
bash <master>$ git merge maint

पहला कमांड मास्टर पर कमेंट करने में आपकी परेशानी से पहले सब कुछ मिला देता है । डिफ़ॉल्ट मर्ज लॉग संदेश आपको समझाएगा कि आप "शाखा 'maint (प्रारंभिक भाग) का विलय कर रहे हैं।

दूसरी कमांड परेशानी मेन्ट को जोड़ती है ~ 3 कमिट, लेकिन "-s हमारा" विकल्प गिट को एक विशेष "मर्ज रणनीति" का उपयोग करने के लिए कहता है, जो वास्तव में, उस पेड़ को रखने से काम करता है जिसे आप मर्ज कर रहे हैं और कमिट को अनदेखा कर रहे हैं (s) ) आप पूरी तरह से विलय कर रहे हैं। लेकिन यह अभी भी माता-पिता के रूप में HEAD और maint ~ 3 के साथ एक नया मर्ज कमिट करता है, इसलिए संशोधन ग्राफ़ अब कहता है कि maint ~ 3 विलय हो गया है। तो वास्तव में आप शायद 'git मर्ज' के लिए -m विकल्प का भी उपयोग करना चाहते हैं, यह समझाने के लिए कि वास्तव में maint ~ 3 कमिट को अनदेखा किया जा रहा है!

अंतिम कमांड केवल मास्टर में मेन्ट (मुख्य ~ 2..maint) के बाकी हिस्सों को मर्ज करता है ताकि आप सभी फिर से सिंक हो जाएं।


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

3
आपके उप-शाखा उदाहरण के बारे में: मुझे संदेह है कि एक बार जब आपने उप-शाखा का विलय कर दिया है तो आप ठीक उसी स्थिति में हैं जैसे आप मेरी पोस्ट के दूसरे चरण के बाद हैं। अतिरिक्त शाखाएँ बनाने से प्रतिबद्ध रिश्तों पर कोई फर्क नहीं पड़ता।
18

5
यदि आप सिर्फ एक बदलाव को छोड़ना चाहते हैं, तो आप ब्याज से बाहर हैं, तो आप केवल एक मर्ज क्यों नहीं करेंगे और फिर तीन बदलाव करने के बजाय उस एक बदलाव को वापस कर देंगे? यह रिपॉजिटरी के लिए कम परिवर्तन और अधिक स्पष्ट इतिहास के परिणामस्वरूप होगा।
मार्क बूथ

3
अक्सर कमिट्स को स्पष्ट रूप से नाम देना आसान होता है। इसलिए आपको बस-मर्ज की गई शाखा के git लॉग को देखना होगा और उस कमिट के हैश को नोट करना चाहिए जो पहले विलय नहीं होना चाहिए और
कमिट

14
@MarkBooth: प्रतिबद्ध आपको छोड़ देना चाहिए शाखा आप में अलग करना चाहते हैं के साथ एक बहुत बड़ा संघर्ष में हो सकता है चाहता हूँ यह आसान है बस इसे बजाय उसके बाद फिर से संघर्ष फिक्सिंग कि परिवर्तन पूर्ववत और फिक्सिंग संघर्ष की छोड़।
SztupY

39

IMHO, करने के लिए सबसे तार्किक बात, सब कुछ मर्ज करना है, और फिर इसे हटाने के लिए git revert (प्रतिबद्ध_you_dont_want) का उपयोग करें

उदाहरण:

git merge master
git revert 12345678

यदि आपके पास कई "टू-इग्नोर" कमिट्स हैं, या रिवर्ट संदेश को संपादित करना चाहते हैं:

git merge master
git revert -n 123456
git revert -n abcdef
git commit -m "... Except commits 123456 and abcdef"

तब आपका इतिहास ऐसा दिख सकता है:

| ... Except 123456 and abcdef
|\ Merge branch 'master' into 'your_branch'

यदि आपके पास केवल "इन-इग्नोर" करने के लिए संघर्ष शामिल हैं, तो आप उपयोग कर सकते हैं:

git merge master -X ours

तो आपका संस्करण दूसरे पर बना रहेगा। त्रुटि संदेशों के बिना भी, आप अभी भी उन अवांछित कमानों को "वापस" कर सकते हैं, क्योंकि उनके पास अन्य बदलाव हो सकते हैं जो संघर्ष नहीं करते थे, और आप अभी भी उन्हें नहीं चाहते हैं।

यदि आपके पास "केवल-अनदेखा" करने के लिए नहीं होने पर संघर्षों का सामना करना पड़ता है, तो आपको उन्हें मैन्युअल रूप से हल करना चाहिए, और संभवतः आपको उन्हें फिर से हल करने के दौरान हल करना होगा।


2
अगर आप बाद में उन उल्टे कमेटियों को ब्रांच में मर्ज करना चाहते हैं, तो क्या अब भी Git उन्हें नजरअंदाज करेगा?
एरिएटे माईबर्ग

@ AnriëtteMyburgh आप बाद में उन्हें मर्ज करने के लिए उलटा कर सकते हैं- कुछ ऐसा जो आप वास्तव में "मर्ज -s हमारी" रणनीति के साथ आसानी से नहीं कर सकते।
लिली चुंग

धन्यवाद, यह वही है जो मुझे चाहिए था एक फीचर शाखा में कुछ पुराने कमिट थे जो मुझे मास्टर में नहीं चाहिए थे और एक गुच्छा जो मुझे मास्टर में चाहिए था। अच्छा और साफ।
वेले ट्रुजिलो

17

कमिट में वंश शामिल है। आप पूर्व कमिट्स को मर्ज किए बिना एक कमेटी को मर्ज नहीं कर सकते।

आप निश्चित रूप से उन्हें चुन सकते हैं। जब आपके पास एक शाखा होती है जो रखरखाव मोड में होती है।


1
धन्यवाद, चेरी पिक काम करेगी। जितना मैं उम्मीद कर रहा था उतना अच्छा नहीं है लेकिन यह करूँगा।
ब्रैड रॉबिन्सन


3

मेरी परियोजना का एक प्रकार का विज्ञापन जो मूल रूप से @araqnid द्वारा वर्णित प्रक्रिया को लपेटता है।

यह एक प्रकार का सहायक है जो निम्नलिखित GIT प्रवाह का परिचय देता है:

  • रखरखाव शाखाओं से देव / मास्टर शाखा में लंबित मर्ज पर एक दैनिक / साप्ताहिक अधिसूचना है
  • शाखा अनुरक्षक स्थिति की जाँच करता है और उसे / खुद तय करता है कि क्या सभी आवश्यक हैं और या तो उन्हें ब्लॉक करें या डेवलपर्स को खुद को ब्लॉक करने के लिए कहें। अंत में रखरखाव शाखा को ऊपर की ओर मर्ज किया जाता है।

परियोजना पृष्ठ का एक उद्धरण:

वर्कफ़्लो के आधार पर मास्टर शाखा के साथ रखरखाव या ग्राहक-विशिष्ट शाखाएँ होना संभव है। इन शाखाओं को एलटीएस शाखा भी कहा जाता है।

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

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

हालाँकि कभी-कभी आप विशेष रूप से कमिट नहीं करना चाहते हैं क्योंकि वे ग्राहक-विशिष्ट हैं और अन्य उपयोगकर्ताओं द्वारा दिखाई नहीं देंगे। या आपकी मास्टर ब्रांच ने यह कहा कि समस्या को ठीक करने के लिए पूरी तरह से अलग दृष्टिकोण की आवश्यकता है, या इससे भी बेहतर, समस्या अब वहां मौजूद नहीं है।

साथ ही रखरखाव शाखा में मास्टर से चेरी-पिक के मामले में जिसके परिणामस्वरूप प्रतिबद्ध मास्टर में अवरुद्ध हो जाएगा।


0

मास्टर 10 में नहीं बल्कि मास्टर 20 में आपके द्वारा किए जाने वाले परिवर्तनों के लिए एक तीसरी शाखा बनाएँ। हमेशा मास्टर 10 को अपना "मास्टर" मानें, जो सभी की सबसे स्थिर शाखा है। अन्य सभी शाखाओं को हर समय सिंक में रखना चाहते हैं।


मुझे लगता है कि काम कर सकता है, लेकिन मैं पहले से ही इस स्थिति में आ गया हूं, और एक तीसरी शाखा शायद मुझे और भी अधिक भ्रमित करेगी। :)
ब्रैड रॉबिन्सन

0

इस मामले की बजाय revertया इसके cherry-pickलिए, आपको उन परिवर्तनों पर विचार करने की आवश्यकता है जो आपके द्वारा किए गए से पुराने होने के लिए छोड़ रहे हैं।

इसलिए:

  1. इससे पहले कि आप छोड़ना चाहते हैं, उससे पहले अंतिम प्रतिबद्ध को मर्ज करें। यह, निश्चित रूप से, सभी कमिट्स को मर्ज करने से पहले होगा। git merge ccc
  2. उन कमिटों को मर्ज करें जिन्हें आप छोड़ना चाहते हैं। git merge fff --no-commit
  3. किसी भी मर्ज को स्टेज करें, सभी परिवर्तनों को अनस्टेज करें, सभी परिवर्तनों को पूर्ववत करें। (शायद इसके लिए मूर्ख-प्रूफ कमांड हैं, लेकिन मैं इस भाग को UI में करूँगा - हालाँकि आप जानते हैं कि कैसे)
  4. खाली मर्ज पूरा करें git merge --continue
  5. आप जिस भी व्यक्ति को छोड़ना चाहते थे, उसके बाद मर्ज कर दें। git merge source-branch-head

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

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