'गिट मर्ज' और 'गिट रीबेस' में क्या अंतर है?


499

बीच क्या अंतर है git mergeऔर git rebase?


14
चूँकि मेरा उत्तर हटा दिया गया था, इस प्रश्न के लिए सही उत्तर पाने के लिए इस लिंक पर जाएँ: git-scm.com/book/en/Git-Branching-Rebasing#The-Basic-Rebase
HiB

6
वैसे मैं इस साइट को जोड़ दूंगा। Git सीखने के बारे में आपको सभी जानने की ज़रूरत है: pcottle.github.io/learnGitBranching
Rollyng

इसे पहले पढ़ें: git-scm.com/book/en/v2/… फिर: git-scm.com/book/en/v2/Git-Branching-Rebasing आप वाकई समझ जाएंगे।
लिबर्ट

जवाबों:


867

मूल रूप से मान लीजिए 3 प्रतिबद्ध थे, A, B, C:

एबीसी

फिर डेवलपर डैन ने कमिट किया D, और डेवलपर एड ने कमिट किया E:

ABCDE

जाहिर है, इस संघर्ष को किसी तरह हल किया जाना चाहिए। इसके लिए, 2 तरीके हैं:

MERGE :

ABCDEM

दोनों प्रतिबद्ध Dऔर Eअभी भी यहाँ है, लेकिन हम मर्ज बनाने के लिए प्रतिबद्ध Mदोनों से कि inherits परिवर्तन Dऔर E। हालांकि, यह हीरे की आकृति बनाता है, जिसे बहुत से लोग बहुत भ्रमित करते हैं।

पढ़ें :

ABCDER

हम प्रतिबद्ध बनाते हैं R, जो कि वास्तविक फ़ाइल सामग्री Mऊपर मर्ज कमिट के समान है । लेकिन, हम प्रतिबद्ध से छुटकारा पा लेते हैं E, जैसे यह कभी अस्तित्व में नहीं था (डॉट्स - लुप्त लाइन द्वारा चिह्नित)। इस विस्मरण के कारण, Eडेवलपर एड के लिए स्थानीय होना चाहिए और इसे किसी अन्य रिपॉजिटरी में नहीं धकेल दिया जाना चाहिए। रिबास का लाभ यह है कि हीरे के आकार से बचा जाता है, और इतिहास अच्छी सीधी रेखा में रहता है - अधिकांश डेवलपर्स प्यार करते हैं!


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

> "हालांकि, यह हीरे की आकृति बनाता है, जिसे बहुत से लोग बहुत भ्रमित करते हैं।" उम ... क्या आप विस्तृत कर सकते हैं?
ग्रेग मैलिक

@GregMaletic: हीरे का आकार गैर-रैखिक इतिहास है। मैं आपके बारे में नहीं जानता, लेकिन मुझे सामान्य रूप से गैर-रेखीय चीजें पसंद नहीं हैं। उस ने कहा, यदि आप वास्तव में इसे पसंद करते हैं तो हीरे के साथ विलय का स्वागत करते हैं - कोई भी आपको मजबूर नहीं कर रहा है।
mvp

1
हालांकि यह उत्तर बेहद मददगार है, लेकिन बेहतर होगा कि आप वास्तविक git कमांड को साधारण foo.txt फाइलों के साथ जोड़कर इसे स्थानीय स्तर पर पुन: पेश करें। पिछले उपयोगकर्ता की तरह, यह स्पष्ट नहीं है कि कौन रिबेस कर रहा है।
भंवर

1
@ सर्फर: मुझे नहीं लगता कि आपको यह सही ढंग से मिला। git mergeinterleave नहीं करता है (लेकिन यह देखकर ऐसा लग सकता है git log)। इसके बजाय, git mergeडैन और एड द्वारा दोनों विकास इतिहास को बरकरार रखा गया है, क्योंकि यह एक समय में हर एक बिंदु से देखा गया था। git rebaseऐसा लगता है कि दान ने पहले इस पर काम किया, और एड ने उसका अनुसरण किया। दोनों मामलों में (मर्ज और रिबेस), वास्तविक परिणामी फ़ाइल ट्री बिल्कुल समान है।
mvp

158

मैं वास्तव में 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 को सिरों को समझने के लिए साधनों को समझने की आवश्यकता होती है। यह सटीक रूप से उन साधनों को समझ रहा है जो Git को इतना कठिन बना देता है। एक उपकरण के रूप में, कुछ कार्य में आवश्यक प्रयास को सरल या कम करने के लिए उपयोग किया जाता है, गिट बुरी तरह से विफल रहता है। अफसोस की बात है कि बहुत से देव इसे महसूस करने में नाकाम हैं।
ATL_DEV

128

व्यक्तिगत रूप से मुझे मानक डायग्रामिंग तकनीक बहुत मददगार नहीं लगती - तीर हमेशा मेरे लिए गलत रास्ता बताते हैं। (वे आम तौर पर प्रत्येक प्रतिबद्ध के "माता-पिता" की ओर इशारा करते हैं, जो समय के साथ पीछे की ओर समाप्त होता है, जो अजीब है)।

इसे शब्दों में समझाने के लिए:

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

जिन कारणों से मुझे समझ नहीं आ रहा है, 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 चीजों के बारे में नफरत करता हूं, जो मुझे एक और जवाब में संदर्भित पोस्ट के बारे में नफरत है )"


42

हालांकि स्वीकृत और सबसे उत्क्रमित उत्तर महान है, मैं इसके अतिरिक्त केवल शब्दों द्वारा अंतर को समझाने की कोशिश कर रहा हूं:

मर्ज

  • “ठीक है, हमें अपनी रिपॉजिटरी के दो अलग-अलग विकसित राज्य मिले। चलो उन्हें एक साथ मिलाते हैं। दो माता-पिता, एक परिणामी बच्चा। ”

रिबेस

  • “मुख्य शाखा के परिवर्तन (जो भी इसका नाम हो) मेरी सुविधा शाखा को दें। बाद में, मुख्य शाखा की वर्तमान स्थिति पर वास्तव में मेरे द्वारा शुरू किए गए फीचर काम का दिखावा करके ऐसा करें। "
  • "प्रतिबिंबित करने के लिए मेरे परिवर्तनों के इतिहास को फिर से लिखें।" (उन्हें जोर-जबरदस्ती करने की जरूरत है, क्योंकि आम तौर पर संस्करण दिए गए इतिहास के साथ छेड़छाड़ नहीं करने के बारे में है )
  • "संभवतया-यदि मैंने अपने काम के साथ बहुत कम बदलाव किए हैं, तो इतिहास वास्तव में बहुत नहीं बदलेगा, अगर मैं अपने कमिट को अलग-अलग देखता हूं (आप 'पैच' भी सोच सकते हैं)।"

सारांश: जब संभव हो, तो रिबास लगभग हमेशा बेहतर होता है। मुख्य शाखा में पुन: एकीकरण करना आसान है।

चूंकि? Patch आपकी सुविधा का काम मुख्य शाखा के संबंध में एक बड़ी 'पैच फ़ाइल' (उर्फ अंतर) के रूप में प्रस्तुत किया जा सकता है , जिसमें कई माता-पिता को समझाने की जरूरत नहीं है: कम से कम दो, एक मर्ज से आ रहे हैं, लेकिन संभावना है कि अगर वहाँ कई मर्ज थे। मर्ज के विपरीत, कई विद्रोह नहीं जोड़ते हैं। (एक और बड़ा प्लस)


18

गेट रिबेस एक मर्ज के करीब है। रिबेस में अंतर है:

  • स्थानीय आवागमन शाखा से अस्थायी रूप से हटा दिए जाते हैं।
  • गिट पुल खींचो
  • अपने सभी स्थानीय कमिट्स को फिर से डालें।

तो इसका मतलब है कि आपके सभी स्थानीय कमिट्स अंत में स्थानांतरित हो जाते हैं, सभी रिमोट के आने के बाद। यदि आपके पास मर्ज संघर्ष है, तो आपको इसे भी हल करना होगा।


7

आसान समझने के लिए मेरा आंकड़ा देख सकते हैं।

रिबेस कमिट हैश को बदल देगा, ताकि यदि आप बहुत अधिक संघर्ष से बचना चाहते हैं, तो उस शाखा के पूर्ण होने पर रिबेस का उपयोग करें।

यहाँ छवि विवरण दर्ज करें


0

मुझे git rebase बनाम मर्ज पर एक बहुत दिलचस्प लेख मिला , इसे यहाँ साझा करने के बारे में सोचा

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