मास्टर से गिट शाखाओं को अपडेट करें


675

मैं Git में नया हूं, और अब मैं इस स्थिति में हूं:

  • मेरी चार शाखाएँ हैं (गुरु, बी १, बी २ और बी ३)।
  • मेरे द्वारा b1-b3 पर काम करने के बाद, मुझे एहसास हुआ कि मेरे पास शाखा मास्टर पर बदलने के लिए कुछ है जो अन्य सभी शाखाओं में होना चाहिए।
  • मैंने वह बदल दिया जिसकी मुझे आवश्यकता थी masterऔर ... यहाँ मेरी समस्या है:

मैं masterशाखा कोड के साथ अन्य सभी शाखाओं को कैसे अपडेट करूं ?



58
फिर भी Git द्वारा एक और सरल कार्य को मुश्किल बना दिया गया। Git devs को अपने SDLC लूप में फीडबैक के रूप में स्टैक ओवरफ्लो का उपयोग करना चाहिए। 300,000 लोगों को यह इंगित करना चाहिए कि Git के वर्कफ़्लो के साथ कुछ गंभीर रूप से गलत है। उन्हें एक यूएक्स विशेषज्ञ को नियुक्त करने की आवश्यकता है क्योंकि वे स्पष्ट रूप से अपने दम पर इसे ठीक से नहीं कर सकते हैं।
j

जवाबों:


620

आपके पास दो विकल्प हैं:

पहला मर्ज है, लेकिन यह मर्ज के लिए एक अतिरिक्त प्रतिबद्ध बनाता है।

प्रत्येक शाखा की जाँच करें:

git checkout b1

फिर मर्ज करें:

git merge origin/master

फिर धक्का:

git push origin b1

वैकल्पिक रूप से, आप एक रिबेस कर सकते हैं:

git fetch
git rebase origin/master

15
मुझे इस दृष्टिकोण के बारे में चिंता है। जब मैं गिट लॉग --ग्राफ को चलाता हूं, तो ग्राफ शो मास्टर वास्तव में विषय शाखा में विलय हो जाता है। क्या इससे लंबे समय में कोई समस्या होगी? मुझे लगता है कि सबसे अच्छा अभ्यास हमेशा विषय शाखा को मास्टर में वापस मर्ज करना है। कृपया टिप्पणी करें।
पैट्रिक

2
: इस मुद्दे के लिए बाहर देखो, अगर आप मर्ज कार्यप्रवाह के साथ जा रहे हैं randyfay.com/node/89
Hampus Ahlgren

22
आप मास्टर को बी 1 में विलय कर रहे हैं। तुम क्यों got push origin master... समझ में नहीं आता है। आप मास्टर शाखा नहीं बदल रहे हैं। मुझे लगता है कि यह 119 अपवोट के साथ एक गलती है: /
यवेस लैंग

22
मर्ज विधि का उपयोग न करें, git rebase masterसही उत्तर है
वेस्टन गैंगर

6
बाद में पढ़ने वाले लोगों के लिए - टायर्स के बारे में @Kursion की चिंता को लेखक द्वारा संपादित किया गया था। इसके अलावा, नीचे दिया गया दूसरा उच्चतम उत्तोलन उत्तर मूल रूप से इस उत्तर के समान ही है, लेकिन शाखा संरचना के एक आरेख और इस चेतावनी के साथ कि आप क्यों नहीं करना चाहते हैं।
परे

495

आपके पास मूल रूप से दो विकल्प हैं:

  1. तुम विलीन हो जाओ। यह वास्तव में काफी सरल है, और एक पूरी तरह से स्थानीय ऑपरेशन है:

    git checkout b1
    git merge master
    # repeat for b2 and b3
    

    यह ठीक उसी तरह से इतिहास को छोड़ता है जैसा कि हुआ: आपने मास्टर से कांटा लगाया, आपने सभी शाखाओं में परिवर्तन किए, और आखिरकार आपने मास्टर से सभी तीन शाखाओं में परिवर्तन को शामिल किया।

    gitइस स्थिति को वास्तव में अच्छी तरह से संभाल सकता है, यह एक ही समय में सभी दिशाओं में होने वाले विलय के लिए डिज़ाइन किया गया है। आप भरोसा कर सकते हैं कि यह सभी थ्रेड्स को एक साथ सही तरीके से प्राप्त करने में सक्षम है। यह केवल परवाह नहीं करता है कि क्या शाखा b1विलय master, या masterविलय b1, मर्ज कमिट सभी को समान दिखता है। एकमात्र अंतर यह है कि कौन सी शाखा इस मर्ज कमिट की ओर इशारा करती है।

  2. आप रिबेट करते हैं। एसवीएन, या इसी तरह की पृष्ठभूमि वाले लोग इसे अधिक सहज पाते हैं। कमांड मर्ज केस के अनुरूप हैं:

    git checkout b1
    git rebase master
    # repeat for b2 and b3
    

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

    A --- B --- C --- D <-- master
     \
      \-- E --- F --- G <-- b1
    

    सही इतिहास में विलय के परिणाम:

    A --- B --- C --- D <-- master
     \                 \
      \-- E --- F --- G +-- H <-- b1
    

    हालाँकि, रिबेस आपको यह इतिहास देता है:

    A --- B --- C --- D <-- master
                       \
                        \-- E' --- F' --- G' <-- b1
    

    मुद्दा यह है कि कमिट्स E', F'और G'वास्तव में कभी अस्तित्व में नहीं थे, और कभी भी परीक्षण नहीं किया गया है। वे संकलन भी नहीं कर सकते हैं। रिबास के माध्यम से निरर्थक कमिट्स बनाना वास्तव में काफी आसान है, खासकर जब बदलाव masterविकास के लिए महत्वपूर्ण हैं b1

    इस का परिणाम हो सकता है, कि आप भेद नहीं कर सकते जो तीन प्रतिबद्ध की E, Fहै, और Gवास्तव में एक प्रतिगमन शुरू की, का मूल्य कम हो git bisect

    मैं यह नहीं कह रहा हूं कि आपको उपयोग नहीं करना चाहिए git rebase। इसके उपयोग हैं। लेकिन जब भी आप इसका उपयोग करते हैं, तो आपको इस तथ्य के बारे में पता होना चाहिए कि आप इतिहास के बारे में झूठ बोल रहे हैं। और आपको कम से कम नए संकलनों का परीक्षण करने के लिए संकलन करना चाहिए।


मैं एक अन्य स्रोत शाखा (मास्टर नहीं) का विलय कर रहा था और इस अच्छे उत्तर को जोड़ने के लिए अतिरिक्त चरणों को विलय से पहले अपने स्थानीय रेपो पर अपडेट करना था (स्थानीय स्तर पर नवीनतम कोड) git checkout <source branch> git pull। फिर ऊपर के साथ जारी है: git checkout b1...
रॉड

3
एक लंबे समय के एसवीएन उपयोगकर्ता के रूप में, मैं रिबेस के लिए मर्ज विकल्प पसंद करता हूं: किसी भी संस्करण नियंत्रण का उपयोग करना आपके द्वारा किए गए परिवर्तनों के सटीक रिकॉर्ड रखने के लिए बहुत महत्वपूर्ण है। मैं स्पष्ट इतिहास को सरल बनाने के लिए रिबास की अपील देख सकता हूं, लेकिन फिर आपको वापस जाना चाहिए और ई ', एफ', जी 'की प्रतिबद्ध टिप्पणियों को जोड़ना चाहिए - और अधिमानतः रिबेस को स्वचालित रूप से उन टिप्पणियों में जोड़ा गया है। अन्यथा यदि बिल्ड / टेस्ट / टेस्ट-परिनियोजन प्रक्रिया G 'पर टूट जाती है तो आपको यह पता लगाना होगा कि बदलाव पूरी जानकारी के बिना क्यों किए गए।
विले

12
इतिहास एक झूठ है
22

धन्यवाद, मैं एक शाखा कोड को दूसरी शाखा में मर्ज करने के लिए "git मर्ज किसी भी शाखा-नाम" का उपयोग करता हूं। स्थानीय रूप से मैं शाखा 1 के कोड का परीक्षण कर सकता हूं जब मैं शाखा 2 पर हूं
प्रीति

1
@blamb मर्ज टकराव दोनों के साथ git mergeऔर होता है git rebase। इनसे कोई परहेज नहीं है। git rebaseआपको रिबासिंग के कई चरणों को छिपाने की अनुमति देने का लाभ है (अर्थात प्रत्येक चरण में संघर्ष की मात्रा को कम करने के लिए कई अलग-अलग कमानों पर एक ही शाखा को रिबास करना)। फिर भी, इतिहास के बारे में झूठ बोलने का एक मात्र तथ्य यह है कि इस तरह के मल्टीस्टेज रिबेस में अच्छा बकवास करना बहुत आसान है ... यही कारण है कि मैं हमेशा मर्ज पसंद करता हूं, भले ही इसका मतलब है कि मुझे कई मर्ज के साथ इतिहास को अव्यवस्थित करने की आवश्यकता है ।
विस्फ़ोटक -

238

git rebase masterऐसा करने का उचित तरीका है। विलय का मतलब होगा कि विलय के लिए एक प्रतिबद्धता बनाई जाएगी, जबकि पुनरावृत्ति नहीं होगी।


52
जब आप पहले से ही उत्पत्ति के लिए धक्का दे चुके हैं, तो क्या होगा यदि आप छूट देते हैं तो आप प्रतिबद्ध इतिहास को फिर से लिखेंगे और यह आपकी दूरस्थ शाखा के साथ संघर्ष करेगा। मुझे लगता है कि रिबास का उपयोग केवल एक पुल पर किया जाना चाहिए या जब आपको किसी दूरस्थ शाखा में नहीं धकेल दिया जाए।
मैट स्मिथ

6
यदि आप दूरस्थ शाखा पर काम करने वाले केवल एक हैं तो आप अपनी दूरस्थ शाखा को विद्रोही स्थानीय शाखा के साथ अद्यतन करने के लिए मूल पुश सुविधा लागू कर सकते हैं। stackoverflow.com/questions/8939977/…
तूफान

7
रिबास और मर्ज दोनों काम करता है, रिबास निजी शाखाओं के लिए सबसे अच्छा है, क्योंकि यह एक क्लीनर इतिहास ग्राफ देता है। यह उत्तर सबसे अच्छा है
जुन्चेन लियू

5
स्पष्टता (एकल-उपयोगकर्ता या छोटी टीम के लिए महान) या गड़बड़ सत्य (बहु-योगदानकर्ता कोड शाखाओं के लिए - बीच में स्थिरता बनाए रखने के लिए - मेरे अनुभव - YMMV) के बीच व्यापार-बंद के बारे में स्पष्ट होना चाहिए।
विल


53

यदि आप किसी शाखा पर काम कर रहे हैं, या बहुत सी अन्य शाखाओं में हुआ है, जबकि आप किसी चीज़ पर काम कर रहे हैं, तो मास्टर पर अपनी शाखा को फिर से बनाना सबसे अच्छा है। यह इतिहास को चुस्त रखता है और चीजों को पालन करने में बहुत आसान बनाता है।

git checkout master
git pull
git checkout local_branch_name
git rebase master
git push --force # force required if you've already pushed

टिप्पणियाँ:

  • उन शाखाओं को फिर से न बनाएँ जो आपने दूसरों के साथ मिलकर की हैं।
  • आपको उस शाखा पर छूट देनी चाहिए, जिसमें आप विलय करेंगे जो हमेशा मास्टर नहीं हो सकता है।

Http://git-scm.com/book/ch3-6.html , और वेब पर अन्य संसाधनों के भार को पुन: व्यवस्थित करने पर एक अध्याय है ।


सरल समाधान के लिए धन्यवाद
अन्य लंबा लड़का

18

@cmaster ने बेहतरीन विस्तृत जवाब दिया। संक्षेप में:

git checkout master #
git pull # update local master from remote master
git checkout <your_branch>
git merge master # solve merge conflicts if you have`

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


13

अपनी शाखा की प्रतिलिपि के साथ अन्य शाखाओं जैसे (बैकअप) को अपडेट करने के लिए। आप किसी भी तरह से (रिबेस या मर्ज) कर सकते हैं ...

  1. रिबास करें (बैकअप शाखा के लिए कोई अतिरिक्त प्रतिबद्धता नहीं होगी)।
  2. मर्ज शाखाएं (बैकअप शाखा में स्वचालित रूप से एक अतिरिक्त प्रतिबद्धता होगी)।

    नोट: रीबेस एक नया आधार (एक नई प्रति) स्थापित करने के अलावा कुछ नहीं है

git checkout backup
git merge master
git push

(अन्य शाखाओं के लिए दोहराएँ अगर किसी भी तरह backup2 और आदि ..)

git checkout backup
git rebase master
git push

(अन्य शाखाओं के लिए दोहराएँ अगर किसी भी तरह backup2 और आदि ..)



1

इस समस्या के लिए दो विकल्प हैं।

1) गिट रिबेस

2) गिट मर्ज

केवल मर्ज के मामले में दोनों से ऊपर के साथ, इतिहास में अतिरिक्त प्रतिबद्ध होगा

1) गिट चेकआउट शाखा (बी 1, बी 2, बी 3)

2) git रिबास मूल / मास्टर (संघर्ष के मामले में स्थानीय रूप से git रिबास - कॉन्टिन्यू करके हल करें)

3) गिट पुश

वैकल्पिक रूप से, git मर्ज विकल्प समान फैशन है

1) git चेकआउट "your_branch" (b1, b2, b3)

2) git मर्ज मास्टर

3) गिट पुश


0

मास्टर से अपनी शाखा अपडेट करने के लिए:

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