बीच क्या अंतर है git merge
और git rebase
?
बीच क्या अंतर है git merge
और git rebase
?
जवाबों:
मूल रूप से मान लीजिए 3 प्रतिबद्ध थे, A
, B
, C
:
फिर डेवलपर डैन ने कमिट किया D
, और डेवलपर एड ने कमिट किया E
:
जाहिर है, इस संघर्ष को किसी तरह हल किया जाना चाहिए। इसके लिए, 2 तरीके हैं:
MERGE :
दोनों प्रतिबद्ध D
और E
अभी भी यहाँ है, लेकिन हम मर्ज बनाने के लिए प्रतिबद्ध M
दोनों से कि inherits परिवर्तन D
और E
। हालांकि, यह हीरे की आकृति बनाता है, जिसे बहुत से लोग बहुत भ्रमित करते हैं।
पढ़ें :
हम प्रतिबद्ध बनाते हैं R
, जो कि वास्तविक फ़ाइल सामग्री M
ऊपर मर्ज कमिट के समान है । लेकिन, हम प्रतिबद्ध से छुटकारा पा लेते हैं E
, जैसे यह कभी अस्तित्व में नहीं था (डॉट्स - लुप्त लाइन द्वारा चिह्नित)। इस विस्मरण के कारण, E
डेवलपर एड के लिए स्थानीय होना चाहिए और इसे किसी अन्य रिपॉजिटरी में नहीं धकेल दिया जाना चाहिए। रिबास का लाभ यह है कि हीरे के आकार से बचा जाता है, और इतिहास अच्छी सीधी रेखा में रहता है - अधिकांश डेवलपर्स प्यार करते हैं!
git merge
interleave नहीं करता है (लेकिन यह देखकर ऐसा लग सकता है git log
)। इसके बजाय, git merge
डैन और एड द्वारा दोनों विकास इतिहास को बरकरार रखा गया है, क्योंकि यह एक समय में हर एक बिंदु से देखा गया था। git rebase
ऐसा लगता है कि दान ने पहले इस पर काम किया, और एड ने उसका अनुसरण किया। दोनों मामलों में (मर्ज और रिबेस), वास्तविक परिणामी फ़ाइल ट्री बिल्कुल समान है।
मैं वास्तव में 10 चीजों के इस अंश से प्यार करता हूं जिसे मैं गित के बारे में नफरत करता हूं (यह अपने दूसरे उदाहरण में रिबेस के लिए एक छोटी व्याख्या देता है):
3. गंदे दस्तावेज
मैन पेज एक सर्वशक्तिमान "च *** आप" 1 हैं । वे एक कंप्यूटर वैज्ञानिक के दृष्टिकोण से आदेशों का वर्णन करते हैं, उपयोगकर्ता नहीं। इसका स्पष्ट उदाहरण:
git-push – Update remote refs along with associated objects
यहाँ मनुष्यों के लिए एक विवरण है:
git-push – Upload changes from your local repository into a remote repository
अद्यतन, एक और उदाहरण: (धन्यवाद cgd)
git-rebase – Forward-port local commits to the updated upstream head
अनुवाद:
git-rebase – Sequentially regenerate a series of commits so they can be applied directly to the head node
और फिर हमारे पास है
git-merge - Join two or more development histories together
जो एक अच्छा वर्णन है।
1. मूल में बिना सेंसर किया हुआ
व्यक्तिगत रूप से मुझे मानक डायग्रामिंग तकनीक बहुत मददगार नहीं लगती - तीर हमेशा मेरे लिए गलत रास्ता बताते हैं। (वे आम तौर पर प्रत्येक प्रतिबद्ध के "माता-पिता" की ओर इशारा करते हैं, जो समय के साथ पीछे की ओर समाप्त होता है, जो अजीब है)।
इसे शब्दों में समझाने के लिए:
जिन कारणों से मुझे समझ नहीं आ रहा है, Git के लिए GUI टूल्स ने कभी भी मर्ज हिस्टरी को अधिक सफाई से पेश करने का प्रयास नहीं किया है, अलग-अलग मर्ज को अमूर्त कर रहा है। इसलिए यदि आप "स्वच्छ इतिहास" चाहते हैं, तो आपको रिबास का उपयोग करने की आवश्यकता है।
मुझे लगता है कि प्रोग्रामर से ब्लॉग पोस्ट पढ़ने के लिए याद करते हैं जो केवल रिबेस और दूसरों का उपयोग करते हैं जो कभी रिबास का उपयोग नहीं करते हैं।
मैं इसे केवल शब्दों के उदाहरण के साथ समझाने की कोशिश करूँगा। मान लीजिए कि आपके प्रोजेक्ट के अन्य लोग उपयोगकर्ता इंटरफ़ेस पर काम कर रहे हैं, और आप दस्तावेज़ लिख रहे हैं। बगैर छूट के, आपका इतिहास कुछ इस तरह दिखाई दे सकता है:
Write tutorial
Merge remote-tracking branch 'origin/master' into fixdocs
Bigger buttons
Drop down list
Extend README
Merge remote-tracking branch 'origin/master' into fixdocs
Make window larger
Fix a mistake in howto.md
अर्थात्, आपके दस्तावेज़ के मध्य में मर्ज और UI कमिट होते हैं।
यदि आपने इसे मर्ज करने के बजाय अपने कोड को मास्टर पर रिबेट किया, तो यह इस तरह दिखाई देगा:
Write tutorial
Extend README
Fix a mistake in howto.md
Bigger buttons
Drop down list
Make window larger
आपके सभी आवागमन शीर्ष पर हैं (सबसे नया), इसके बाद बाकी master
शाखा।
( डिस्क्लेमर: मैं "10 चीजों के बारे में नफरत करता हूं, जो मुझे एक और जवाब में संदर्भित पोस्ट के बारे में नफरत है )"
हालांकि स्वीकृत और सबसे उत्क्रमित उत्तर महान है, मैं इसके अतिरिक्त केवल शब्दों द्वारा अंतर को समझाने की कोशिश कर रहा हूं:
मर्ज
रिबेस
सारांश: जब संभव हो, तो रिबास लगभग हमेशा बेहतर होता है। मुख्य शाखा में पुन: एकीकरण करना आसान है।
चूंकि? Patch आपकी सुविधा का काम मुख्य शाखा के संबंध में एक बड़ी 'पैच फ़ाइल' (उर्फ अंतर) के रूप में प्रस्तुत किया जा सकता है , जिसमें कई माता-पिता को समझाने की जरूरत नहीं है: कम से कम दो, एक मर्ज से आ रहे हैं, लेकिन संभावना है कि अगर वहाँ कई मर्ज थे। मर्ज के विपरीत, कई विद्रोह नहीं जोड़ते हैं। (एक और बड़ा प्लस)
गेट रिबेस एक मर्ज के करीब है। रिबेस में अंतर है:
तो इसका मतलब है कि आपके सभी स्थानीय कमिट्स अंत में स्थानांतरित हो जाते हैं, सभी रिमोट के आने के बाद। यदि आपके पास मर्ज संघर्ष है, तो आपको इसे भी हल करना होगा।
मुझे git rebase बनाम मर्ज पर एक बहुत दिलचस्प लेख मिला , इसे यहाँ साझा करने के बारे में सोचा