जीआईटी पुल वीएस गिट लाने बनाम जीआईटी रिबेस


294

एक और प्रश्न कहा git pullजाता है जैसे git fetch+ git merge

लेकिन git pullवीएस git fetch+ के बीच अंतर क्या है git rebase?


2
किसी को लिंक को साफ करना चाहिए ... और मुझे आश्चर्य है कि दूसरे को कितने वोट मिले।
ज़ेनोटेरैसाइड

13
@xeno: मुझे लगता है कि इसकी सिर्फ एक गिनती है कि कितने लोग "मेरे पास भी यह सवाल है"
बोबोबो

44
किसी दिन मुझे वास्तव में गिट प्रलेखन पढ़ने का समय मिल जाएगा, लेकिन तब तक, मैं इस प्रकार के प्रश्नों में अपने वोट जोड़ रहा हूं
एरन मेडन

जवाबों:


336

यह अपने प्रश्न से बहुत स्पष्ट होना चाहिए कि आप वास्तव में सिर्फ बीच अंतर के बारे में पूछ रहे हैं git mergeऔर git rebase

तो मान लीजिए कि आप सामान्य स्थिति में हैं - आपने अपनी मास्टर शाखा में कुछ काम किया है, और आप मूल से खींचते हैं, जिसने कुछ काम भी किया है। लाने के बाद, चीजें इस तरह दिखती हैं:

- o - o - o - H - A - B - C (master)
               \
                P - Q - R (origin/master)

यदि आप इस बिंदु (git पुल के डिफ़ॉल्ट व्यवहार) में विलय करते हैं, तो यह मानते हुए कि कोई संघर्ष नहीं है, आप इसके साथ समाप्त होते हैं:

- o - o - o - H - A - B - C - X (master)
               \             /
                P - Q - R --- (origin/master)

यदि दूसरी ओर आपने उचित छूट दी है, तो आप इसे समाप्त कर देंगे:

- o - o - o - H - P - Q - R - A' - B' - C' (master)
                          |
                          (origin/master)

आपके काम के पेड़ की सामग्री दोनों मामलों में समान होनी चाहिए; आपने अभी तक एक अलग इतिहास बनाया है । रिबेस आपके इतिहास को फिर से लिखता है, जिससे यह पता चलता है कि आपने मूल नई मास्टर शाखा ( R) के शीर्ष पर जहां आपने मूल रूप से प्रतिबद्ध किया था (के बजाय H)। आपको कभी भी रिबास दृष्टिकोण का उपयोग नहीं करना चाहिए अगर किसी और ने आपकी मास्टर शाखा से पहले ही खींच लिया हो।

अंत में, ध्यान दें कि आप वास्तव git pullमें दिए गए ब्रांच के लिए सेट कर सकते हैं, ताकि विन्यास पैरामीटर branch.<name>.rebaseको सही पर सेट करके मर्ज के बजाय रिबेज का उपयोग किया जा सके। आप एकल पुल का उपयोग करके भी ऐसा कर सकते हैं git pull --rebase


39
यदि किसी को आपकी मास्टर शाखा से पहले ही खींच लिया गया था, तो आपको क्या करना है? क्या यह रेपो को तोड़ देगा?
डिडियर ए।

12
आपको कैसे पता चलेगा कि आपकी मास्टर शाखा से किसी ने खींच लिया है?
फ्रैंक

29
यदि आप यह नहीं जानते कि कोई ऐसा नहीं है , तो आपको यह मान लेना चाहिए कि उनके पास है।
क्रिस डाउन

4
मैं सिर्फ यह सोच रहा था कि जब तक आप मूल / मास्टर के अलावा कहीं और बदलाव नहीं कर रहे हैं, मैं कभी किसी और की समस्या में भागते हुए नहीं दिख रहा हूं, क्योंकि आपने पहले से ही इन बदलावों को आगे बढ़ाया है। गुरु, पहले स्थान पर कुछ भी नहीं होगा। यह मुझे लगता है कि चेतावनी वास्तव में केवल उन मामलों में मायने रखती है जहां आपको एक्स -> मूल / एक्स की तुलना में कुछ अधिक जटिल मिला है, लेकिन मैं गलत हो सकता है। यदि कोई ऐसे परिदृश्य के बारे में जानता है जिसे मैं देख रहा हूँ, तो कृपया साझा करें।
neverfox

1
@SteveChambers नहीं, यह परिणाम नहीं है। रेखाएं केवल पूर्वजों का प्रतिनिधित्व करती हैं, अर्थात A, B का जनक है। इस बारे में कोई अनुमान नहीं है कि Q या B पहली बार था। ये सभी ऑपरेशन प्रतिबद्ध ग्राफ़ पर आधारित हैं, समय नहीं। रिबेस बस कुछ कमिट्स ट्रांसप्लांट करता है, जिसके परिणाम के रूप में मुझे कोई फर्क नहीं पड़ता कि प्रतिबद्ध टाइमस्टैम्प क्या हैं।
कैस्केबेल

9

TLDR:

git pullदौड़ने जैसा है तो git fetchतब git merge
git pull --rebaseजैसा हैgit fetchgit rebase

आपके पहले बयान के जवाब में,

git pulla git fetch+ की तरह है git merge

"इसके डिफ़ॉल्ट मोड में, FETCH_HEAD के git fetchबाद git पुल शॉर्टहैंड है git merge" अधिक सटीक रूप से, दिए गए मापदंडों के साथ git pullचलता है git fetchऔर फिर git mergeप्राप्त शाखा प्रमुखों को वर्तमान शाखा में विलय करने के लिए कॉल करता है "

(रेफरी: https://git-scm.com/docs/git-pull )


आपके दूसरे कथन / प्रश्न के लिए:

'लेकिन git pullवीएस git fetch+ के बीच क्या अंतर है git rebase'

फिर से, उसी स्रोत से:
git pull --rebase

"ब्रेबेज़ के साथ, यह git मर्ज के बजाय git rebase चलाता है।"


अब अगर आप पूछना चाहते थे

' mergeऔर rebase' के बीच का अंतर

इसका उत्तर यहां भी दिया गया है:
https://git-scm.com/book/en/v2/Git-Branching-Rebasing
(जिस तरह से संस्करण इतिहास दर्ज किया गया है उसे बदलने के बीच का अंतर)


2
मैं यह उल्लेख करना चाहूंगा कि "git pull --rebase" की तरह "git fetch तो git rebase" अधिकांश समय होता है - लेकिन हमेशा नहीं। कुछ स्थितियों में, "गिट पुल - क्रेबेज़" थोड़ा अधिक करता है। यहाँ देखें अक्सर संदर्भित उदाहरण: gitolite.com/git-pull--rebase
Daniel K.

1
अपने जवाब के लिए आपको बहुत बहुत धन्यवाद। मैं वास्तव में git fetch + git rebaseअब से काम करने के तरीके को समझता हूं । अब से हमारे git ट्री पर कोई कम या ज्यादा संघर्ष नहीं है :)
ट्रैविस ले
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.