शाखाओं को मर्ज करना और conflicts को हल करना


आपकी feature branch पूरी हो गई है। toggle काम कर रहा है, आपने changes को commit कर दिया है, और अब आप उस काम को main में चाहते हैं जहाँ बाकी टीम का कोड रहता है। ज्यादातर समय इसे लाना तेज़ और शांत होता है: Git दोनों branches की तुलना करता है, कोई overlap नहीं खोजता है, और काम को कोई अतिरिक्त कदम के बिना डाल देता है। कभी-कभी, हालांकि, आप और एक टीम सदस्य अलग-अलग branches पर एक ही लाइनों को बदलते हैं, और Git यह नहीं जान सकता कि आप कौन सा version रखना चाहते हैं। यह स्थिति लगभग हर project में एक से अधिक व्यक्ति के committing में दिखाई देती है। यह branching का एक सामान्य, रोज़मर्रा का हिस्सा है, और इसका मतलब है कि Git को एक ही लाइनों के बारे में दो विचार मिले हैं और वह आपका फैसला चाहता है कि कौन सा जीते।
git merge से एक branch को वापस लाना
मान लें कि आपने Fahrenheit toggle को अपनी स्वयं की branch add-fahrenheit-toggle पर बनाया, और main उस समय के बाद नहीं हिला जब आपने इससे branch बनाई। main पर स्विच करें और git merge को उस branch के नाम के साथ चलाएं जिसे आप लाना चाहते हैं:
$ git switch main
$ git merge add-fahrenheit-toggle
Updating 4f2a891..8c3d1a0
Fast-forward
src/index.js | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)git merge <branch> हमेशा नामित branch को उस branch में merge करता है जिस पर आप वर्तमान में खड़े हैं, इसलिए पहले main पर स्विच करना महत्वपूर्ण है। जिस branch पर आप खड़े हैं वह वह है जो merge को प्राप्त करता है। इसके चलने के बाद, main के पास add-fahrenheit-toggle का प्रत्येक commit है। feature branch स्वयं untouched है: आप इस पर काम करना जारी रख सकते हैं या अब इसे delete कर सकते हैं क्योंकि इसका काम main पर भी रहता है।
git merge branch-name उस branch के commits को उस branch में लाता है जिस पर आप वर्तमान में हैं, इसलिए पहले main पर स्विच करें। ज्यादातर merges silently background में होते हैं और आप अपने दिन के साथ आगे बढ़ते हैं। feature branch में कुछ भी नहीं बदलता; आप इसे use करना जारी रख सकते हैं या एक बार delete कर सकते हैं main के पास काम है। एक merge conflict क्या दिखता है
एक conflict तब होता है जब एक merge के दोनों sides पर एक ही लाइनें बदलती हैं, और Git के पास कोई तरीका नहीं है यह बताने के लिए कि आप कौन सा version चाहते हैं। मान लीजिए एक टीम सदस्य एक loading spinner को main में merge करता है जो src/index.js में एक function को बदलता है, और आपकी add-fahrenheit-toggle branch ने toggle जोड़ने के लिए एक ही function को बदल दिया। अब merging halfway through रुक जाता है बजाय समाप्त होने के:
$ git switch main
$ git merge add-fahrenheit-toggle
Auto-merging src/index.js
CONFLICT (content): Merge conflict in src/index.js
Automatic merge failed; fix conflicts and then commit the result.यह एक merge conflict है। फ़ाइल खोलें और आप पाएंगे कि Git ने ठीक उस जगह को mark किया है जहां दोनों versions असहमत हैं:
<<<<<<< HEAD
showLoadingSpinner(true);
=======
const tempF = celsiusToFahrenheit(tempC);
>>>>>>> add-fahrenheit-toggle<<<<<<< HEAD चिह्नित करता है आपकी branch पर वर्तमान है (इस case में main)। ======= दोनों versions को divide करता है। >>>>>>> add-fahrenheit-toggle incoming branch के version के अंत को चिह्नित करता है। markers के बीच सब कुछ एक ही handful of lines है, दो अलग-अलग तरीकों से लिखी गई।
एक conflict का मतलब Git को आपके judgment की जरूरत है; कुछ भी broken नहीं है। Git को एक ही लाइनों में दो changes मिले और कोई तरीका नहीं है यह अनुमान लगाने का कि आप कौन सा चाहते हैं, इसलिए यह रुकता है और आपसे decide करने के लिए पूछता है। फ़ाइल को edit करें जब तक यह उस तरीके से न पढ़े जो आप चाहते हैं, किसी भी version को रखते हुए, दोनों, या कुछ नया जो उन्हें combine करता है, फिर marker lines को delete करें:
showLoadingSpinner(true);
const tempF = celsiusToFahrenheit(tempC);एक बार फ़ाइल सही लगने लगे, stage और commit करें इसे ठीक किसी अन्य change की तरह:
$ git add src/index.js
$ git commitयहाँ कोई message के बिना git commit चलाना आपके editor को खोलता है एक message के साथ Git पहले से prepare किया गया है, merge का वर्णन करते हुए। save और close करें, और merge पूरा है।
<<<<<<<, =======, और >>>>>>> के लिए देखें, edit करें जब तक यह read न करे कि आप कैसे चाहते हैं, फिर उन marker lines को delete करें। git add और git commit के साथ finish करें। मेरा पहला conflict एक emergency की तरह महसूस हुआ; यह Git asking out करता था मुझसे एक fairly ordinary question। इसे एक साथ वापस लाना
Merging वह है जो branching को worth करता है: आप safely अपनी स्वयं की line of history पर experiment करते हैं, Branches में covered, फिर उस काम को main में fold करते हैं एक बार यह ready है, conflicts और सभी। GitHub पर, same operation आमतौर पर एक pull request के through होता है बजाय आपकी machine पर local git merge के; pull request flow chapter propose, review, और merge करने को cover करता है एक shared project पर एक change। अगर एक merge कभी आपने intended से कहीं और land करता है आपने पहले से commit किए बाद, undoing things cover करता है कैसे safely back out करें।

