मुझे git पुल --rebase का उपयोग कब करना चाहिए?


805

मुझे कुछ ऐसे लोगों के बारे में पता है जो git pull --rebaseडिफ़ॉल्ट रूप से उपयोग करते हैं और अन्य लोग जो इसका उपयोग न करने का आग्रह करते हैं। मेरा मानना ​​है कि मैं विलय और रिबासिंग के बीच अंतर को समझता हूं, लेकिन मैं इसे संदर्भ में रखने की कोशिश कर रहा हूं git pull। क्या यह बहुत सारे मर्ज कमिट मैसेज नहीं देखना चाहते हैं, या अन्य मुद्दे हैं?


1
गिट पुल - क्रेब के खिलाफ सलाह देने वाले लोगों के लिए स्रोत ? रिबास या गिट रिबेट गिट पुल --rebase से अलग गतिविधि है !
przemo_li

जवाबों:


583

आपको git pull --rebaseकब उपयोग करना चाहिए

  • आपके परिवर्तन एक अलग शाखा के लायक नहीं हैं

वास्तव में - तब क्यों नहीं? यह अधिक स्पष्ट है, और आपके कमिट पर तार्किक समूहन नहीं करता है।


ठीक है, मुझे लगता है कि इसे कुछ स्पष्टीकरण की आवश्यकता है। Git में, जैसा कि आप शायद जानते हैं, आपको शाखा और मर्ज करने के लिए प्रोत्साहित किया जाता है। आपकी स्थानीय शाखा, जिसमें आप परिवर्तन खींचते हैं, और दूरस्थ शाखा वास्तव में, विभिन्न शाखाएँ हैं, और git pullउन्हें विलय करने के बारे में है। यह उचित है, क्योंकि आप बहुत बार धक्का नहीं देते हैं और आमतौर पर एक पूर्ण सुविधा का गठन करने से पहले आमतौर पर कई परिवर्तन जमा करते हैं।

हालांकि, कभी-कभी - जो भी कारण से - आपको लगता है कि यह वास्तव में बेहतर होगा अगर ये दो - दूरस्थ और स्थानीय - एक शाखा थे । जैसे SVN में। यह यहाँ है जहाँ git pull --rebaseखेलने में आता है। अब आप विलय नहीं करते हैं - आप वास्तव में दूरस्थ शाखा के शीर्ष पर रहते हैं । यही वास्तव में है।

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


17
मुझे लगता है कि जब आप एक ही शाखा पर काम करते हैं तो यह उपयोगी होता है, लेकिन आप अपना कार्य केंद्र बदल सकते हैं। मैं अपने परिवर्तनों को एक कार्य केंद्र से करने और उसके बाद दूसरे में रिबास खींचने के लिए प्रतिबद्ध हूं और उसी शाखा पर काम करता रहूं।
पाब्लो पाज़ोस

11
यह स्वचालित रूप से पुल से रिबेट करने के लिए गिट को स्थापित करने के लिए एक उपयोगी सबसे अच्छा अभ्यास है git config --global pull.rebase preserve (यदि आप किसी स्थानीय स्तर पर बनाया है, तो विलय को संरक्षित करने का प्रयास करने के लिए, रिबासिंग को सक्षम करने के अलावा संरक्षित करें)।
कॉलिन डी बेनेट

2
मैं असहमत हूं कि आपको केवल एक शाखा पर काम करते समय पुल - क्रेब का उपयोग करना चाहिए। आपको हर समय इसका उपयोग करना चाहिए, जब तक कि किसी अन्य परिस्थिति के कारण असंभव न हो।
टॉमहज फजफर

@ पी शेव्ड ... 'हालांकि, कभी-कभी - जो भी कारण से - आपको लगता है कि यह वास्तव में बेहतर होगा अगर ये दो - दूरस्थ और स्थानीय - एक शाखा थे' ... क्या यह किया जा सकता है? मेरी समझ में आ रहा है? स्थानीय परिवेश में, मैं अपनी शाखा और मूल / मास्टर के रूप में एक दूरस्थ शाखा दर्पण रख सकता हूं। क्या यूओ कृपया यहां इनपुट प्रदान कर सकते हैं?
मंड्रोइड

736

मैं "git पुल --rebase" वास्तव में क्या मतलब है, पर एक अलग दृष्टिकोण प्रदान करना चाहूंगा, क्योंकि यह कभी-कभी खो जाता है।

यदि आपने कभी तोड़फोड़ (या CVS) का उपयोग किया है, तो आपको "svn अपडेट" के व्यवहार के लिए इस्तेमाल किया जा सकता है। यदि आपके पास करने के लिए परिवर्तन हैं और प्रतिबद्ध विफल रहता है क्योंकि परिवर्तन ऊपर की ओर किए गए हैं, तो आप "svn अद्यतन"। आपके साथ अपस्ट्रीम परिवर्तनों को मर्ज करके तोड़फोड़ आगे बढ़ती है, संभवतः संघर्षों के परिणामस्वरूप।

जो तोड़फोड़ अभी-अभी हुई, वह अनिवार्य रूप से "पुल - क्रेबेज़" थी। नए संस्करण के सापेक्ष आपके स्थानीय परिवर्तनों को फिर से तैयार करने का कार्य इसका "रीबासिंग" हिस्सा है। यदि आपने विफल किए गए प्रयास से पहले "svn diff" किया था, और "svn diff" के आउटपुट के साथ परिणामी अंतर की तुलना बाद में करते हैं, तो दोनों के बीच अंतर यह होता है कि रिबासिंग ऑपरेशन ने क्या किया।

इस मामले में गिट और तोड़फोड़ के बीच मुख्य अंतर यह है कि तोड़फोड़ में, "आपके" परिवर्तन केवल आपके काम की प्रतिलिपि में गैर-प्रतिबद्ध परिवर्तनों के रूप में मौजूद हैं, जबकि गिट में आपके पास स्थानीय रूप से वास्तविक आवागमन होता है। दूसरे शब्दों में, Git में आपने इतिहास को कांटा है; आपके इतिहास और अपस्ट्रीम इतिहास को बदल दिया गया है, लेकिन आपके पास एक सामान्य पूर्वज है।

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

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

कृपया अन्य लोगों पर विचार करें जिन्हें आपकी परियोजना के इतिहास को देखने और समझने की आवश्यकता है। क्या आप चाहते हैं कि इतिहास सैकड़ों मर्जों से अटे पड़े हो, या क्या आप केवल कुछ मर्जों का चयन करना चाहते हैं जो जानबूझकर विचलन विकास प्रयासों के वास्तविक मर्ज का प्रतिनिधित्व करते हैं?


18
@MarceloCantos स्पष्ट होने के लिए, मैं यह नहीं कह रहा हूं कि git (टूल) को रीबेस करने के लिए डिफ़ॉल्ट होना चाहिए। यह खतरनाक होगा क्योंकि एक खंड अनिवार्य रूप से इतिहास को नष्ट कर देता है। मैं यह कह रहा हूं कि वर्कफ़्लो के संदर्भ में, जब आप शाखा में आने का इरादा नहीं कर रहे हैं और बस कुछ शाखा में हैकिंग कर रहे हैं, जो अन्य लोग भी काम कर रहे हैं, "git pull --rebase" उपयोगकर्ता का डिफ़ॉल्ट व्यवहार होना चाहिए।
स्कॉड

1
आप कह रहे हैं कि एक नहीं करना चाहिए git config --global branch.autosetupmerge always?
मार्सेलो कैंटोस

9
@MarceloCantos नहीं मैं नहीं हूँ;) व्यक्तिगत रूप से मैं ऑटोसिटअपमर को वास्तविक के डिफ़ॉल्ट छोड़ देता हूं (यदि मैं स्थानीय <-> रिमोट के अलावा अन्य शाखाओं के बीच वापस और चौथे का विलय कर रहा हूं, तो मुझे यह स्पष्ट होना पसंद है)। मैं सिर्फ यह कह रहा हूं कि एक इंसान के रूप में, मैं हमेशा अपनी सामान्य "मास्टर शाखा में नवीनतम" वर्कफ़्लो के हिस्से के रूप में "git pull --rebase" का उपयोग करता हूं, क्योंकि मैं तब तक मर्ज कमिट नहीं बनाना चाहता जब तक कि मैं स्पष्ट रूप से शाखा नहीं कर रहा हूं।
scode

9
+1 @ कोड। रिबास / मर्ज प्रश्न के साथ जूझने के कई दर्दनाक घंटों के बाद, अंत में यहां एक जवाब है कि इसे नाखून दें।
अगिलेयोगी

10
यह उत्तर गैर-वितरित संस्करण नियंत्रण प्रणालियों के उपयोगकर्ताओं को अनुकूलित करने का एक प्रयास है, जो उन्हें उचित शाखाओं के लाभों को ठीक से समझने का मौका देने के बजाय Git को प्रदान करता है।
एलेक्सी ज़िमरेव

211

शायद यह समझाने का सबसे अच्छा तरीका एक उदाहरण के साथ है:

  1. ऐलिस विषय शाखा ए बनाता है, और उस पर काम करता है
  2. बॉब असंबंधित विषय शाखा बी बनाता है, और इस पर काम करता है
  3. ऐलिस करता है git checkout master && git pull। मास्टर पहले से ही अद्यतित है।
  4. बॉब करता है git checkout master && git pull। मास्टर पहले से ही अद्यतित है।
  5. ऐलिस करता है git merge topic-branch-A
  6. बॉब करता है git merge topic-branch-B
  7. git push origin masterऐलिस से पहले बॉब करता है
  8. ऐलिस करता है git push origin master, जिसे अस्वीकार कर दिया जाता है क्योंकि यह तेजी से आगे बढ़ने वाला मर्ज नहीं है।
  9. ऐलिस मूल / मास्टर की लॉग को देखता है, और देखता है कि प्रतिबद्ध उसके लिए असंबंधित है।
  10. ऐलिस करता है git pull --rebase origin master
  11. एलिस का मर्ज कमिट है, बॉब की कमिट खिंच गई है, और बॉब की कमिट के बाद एलिस का कमिट लागू होता है।
  12. ऐलिस करता है git push origin master, और हर कोई खुश है कि उन्हें भविष्य में लॉग को देखने के लिए एक बेकार मर्ज कमिट नहीं पढ़ना है।

ध्यान दें कि विशिष्ट शाखा को मर्ज किया जाना उदाहरण के लिए अप्रासंगिक है। इस उदाहरण में मास्टर आसानी से एक रिलीज शाखा या देव शाखा हो सकता है। मुख्य बिंदु यह है कि ऐलिस और बॉब एक ​​साथ अपनी स्थानीय शाखाओं को एक साझा दूरस्थ शाखा में विलय कर रहे हैं।


2
अच्छा लगा। मैं स्पष्ट होना चाहता हूं git co master && git pull; git checkout topic-branch-A; git rebase master; git checkout master; git merge topic-branch-A; git push origin masterऔर फिर से दोहराता हूं कि यदि दूसरे का मास्टर के साथ मेरा धक्का हुआ। हालांकि मैं आपके नुस्खा में रसीला लाभ देख सकता हूं।
हांकाका

अच्छा स्पष्टीकरण
रजनीकांत प्रधान

148

मुझे लगता है कि आपको git pull --rebaseउसी शाखा पर दूसरों के साथ सहयोग करते समय उपयोग करना चाहिए । आप अपने काम में हैं → प्रतिबद्ध → काम → प्रतिबद्ध चक्र, और जब आप अपने काम को धक्का देने का फैसला करते हैं तो आपका धक्का अस्वीकार कर दिया जाता है, क्योंकि एक ही शाखा पर समानांतर काम होता है। इस बिंदु पर मैं हमेशा एक pull --rebase। मैं स्क्वैश का उपयोग नहीं करता (कमिट को समतल करने के लिए), लेकिन अतिरिक्त मर्ज के कमिट्स से बचने के लिए मैं रिबेस करता हूं।

जैसे-जैसे आपका Git ज्ञान बढ़ता है, आप अपने आप को इतिहास में किसी अन्य संस्करण नियंत्रण प्रणाली की तुलना में बहुत अधिक देख रहे हैं जो मैंने उपयोग किया है। यदि आपके पास एक टन छोटा मर्ज है, तो आपके इतिहास में हो रही बड़ी तस्वीर का ध्यान खोना आसान है।

यह वास्तव में एकमात्र समय है जब मैं रिबासिंग (*) करता हूं, और मेरे बाकी वर्कफ़्लो मर्ज आधारित हैं। लेकिन जब तक आपके सबसे अधिक बार आने वाले कमिटर्स ऐसा करते हैं, तब तक इतिहास अंत में बहुत बेहतर दिखता है।

(*) जीआईटी पाठ्यक्रम पढ़ाने के दौरान, मुझे इस पर एक छात्र ने मुझे गिरफ्तार कर लिया था, क्योंकि मैंने कुछ परिस्थितियों में रिबासिंग सुविधा शाखाओं की भी वकालत की थी। और उसने इस उत्तर को पढ़ा था;) इस तरह का पुनरावृत्ति भी संभव है, लेकिन यह हमेशा एक पूर्व-व्यवस्थित / सहमत प्रणाली के अनुसार होना चाहिए, और जैसे कि "हमेशा" लागू नहीं किया जाना चाहिए। और उस समय मैं आमतौर पर pull --rebaseया तो ऐसा नहीं करता , जो कि सवाल है;)


2
निश्चित रूप से एक लॉग से मर्ज कमिट्स को छुपाने के लिए एक स्क्रिप्ट लिख सकता है
18'10


9
@ जसेन जी हां, लेकिन उन
मर्जों के आंकड़े

यह उत्तर अस्पष्ट और चुने हुए उत्तर की तुलना में माना जाता है: आप "एक ही शाखा" से वास्तव में क्या मतलब है? कुछ अच्छे बिंदु हैं, जो हालांकि चुने हुए उत्तर में नहीं हैं।
इविन

1
"शाखा" के आसपास की अस्पष्टता काफी जानबूझकर है, क्योंकि रेफ के उपयोग के लिए बहुत सारे तरीके हैं; "काम की रेखा" सिर्फ एक विकल्प है।
krosenvold

49

मुझे नहीं लगता कि इसका उपयोग करने का कोई कारण है pull --rebase- मैंने विशेष रूप से अपने git pullकमांड को अपस्ट्रीम कमिट्स के खिलाफ हमेशा रिबास करने की अनुमति देने के लिए कोड जोड़ा ।

जब इतिहास के माध्यम से देख रहे हैं, तो यह जानना कभी दिलचस्प नहीं होगा कि फीचर पर काम करने वाला लड़का / लड़की कब सिंक्रनाइज़ करना बंद कर देता है। यह आदमी / लड़की के लिए उपयोगी हो सकता है जबकि वह ऐसा कर रहा है, लेकिन यही वह है reflog। यह सिर्फ बाकी सभी के लिए शोर जोड़ रहा है।


2
"जब इतिहास के माध्यम से देखते हैं, तो यह जानना कभी दिलचस्प नहीं होता है कि फीचर पर काम करने वाला आदमी सिंक करने के लिए कब रुका।" / लेकिन इसका मतलब यह नहीं है कि मध्यवर्ती मध्यवर्ती संभावित रूप से टूटे हुए हैं?
२१:३

10
हां, और वे "पूरे राज्य" भी नहीं हैं। इसलिए हम उन्हें नहीं चाहते हैं। मैं जानना चाहता हूं कि वह क्या चाहता था, न कि वह वहां कैसे पहुंचा।
डस्टिन

4
यदि pull --rebaseहमेशा उपयोग किया जाना चाहिए, pullतो यह डिफ़ॉल्ट रूप से क्यों नहीं करता है ?
5

2
मुझे डर है कि आप अपनी राय बनाने जा रहे हैं। मैंने अपने .gitconfigविकल्पों में से कुछ को सही करने के लिए कई चीजें हासिल की हैं। मुझे लगता है कि git rebase डिफ़ॉल्ट रूप से गलत काम करता है, जैसे git टैग, आदि ... यदि आप असहमत हैं, तो आपको अपनी राय को सही ठहराने की आवश्यकता नहीं है।
डस्टिन

8
यदि आप "अपस्ट्रीम" से खींचते हैं, तो यह अच्छी सलाह लगती है master, और यदि आपके द्वारा खींची गई शाखा सार्वजनिक नहीं हुई (अभी तक)। यदि आप एक सुविधा शाखा से दूसरी तरफ खींचते हैं तो masterयह अन्य तरह से चारों ओर है: उपयोग करने का कोई कारण नहीं है --rebase, है ना? यही कारण है कि यह डिफ़ॉल्ट नहीं है। मैंने पाया कि Rebases हैं कि कैसे परिवर्तन पदानुक्रम के ऊपर से नीचे की ओर से गुजरना चाहिए और मर्ज यह है कि वे ऊपर की ओर कैसे बहते हैं। derekgourlay.com/blog/git-when-to-merge-vs-when-to-rebase
jolvi

38

बस याद रखना:

  • खींच = लाना + मर्ज
  • pull --rebase = fetch + rebase

इसलिए, वह तरीका चुनें जो आप अपनी शाखा को संभालना चाहते हैं।

बेहतर होगा कि आप मर्ज और रिबेस के बीच का अंतर जानें :)


9

मुझे लगता है कि यह एक निजी प्राथमिकता है।

क्या आप अपने बदलावों को आगे बढ़ाने से पहले अपनी मूर्खतापूर्ण गलतियों को छिपाना चाहते हैं? यदि हां, तो git pull --rebaseसही है। यह आपको बाद में अपने कमिट्स को कुछ (या एक) कमिट में स्क्वैश करने की अनुमति देता है। यदि आपके (अप्रकाशित) इतिहास में विलय हो गया है, तो git rebaseबाद में करना इतना आसान नहीं है ।

मुझे व्यक्तिगत रूप से अपनी सभी मूर्खतापूर्ण गलतियों को प्रकाशित करने में कोई आपत्ति नहीं है, इसलिए मैं विद्रोह के बजाय विलय करने की ओर अग्रसर हूं।


8
इस प्रश्न को देखने वाले किसी भी व्यक्ति पर ध्यान दें: यह उत्तर इस प्रश्न के लिए पूरी तरह से अप्रासंगिक है "मुझे गिट पुल - क्रेबेज़ का उपयोग कब करना चाहिए?"
उपचारकाल

3
@ एथेलेक्लान्नी मैंने उत्तर संपादित किया ताकि यह स्पष्ट हो जाए कि यह प्रश्न के लिए कैसे प्रासंगिक है (उम्मीद को नष्ट किए बिना)।
पाओलो एबरमन

एक गंदा और असंरचित कार्य-लॉग साझा करना एक ईमानदार प्रयास नहीं है, यह सिर्फ आलस्य है। आप अपने विकास और डिबगिंग के खरगोश छेद के माध्यम से उन्हें पीछा करके लोगों का समय बर्बाद कर रहे हैं; उन्हें परिणाम दें, न कि तोड़फोड़।
क्रिस्टा

8

git pull --rebaseएक सहयोगी से एक इतिहास पुनर्लेखन छिपा सकते हैं git push --force। मैं आपको git pull --rebase केवल तभी उपयोग करने की सलाह देता हूं जब आप जानते हैं कि आप अपने कमिट्स को आगे बढ़ाने से पहले भूल जाते हैं।

यदि आपने कुछ भी नहीं किया है, लेकिन आपके काम करने की जगह साफ नहीं है, ठीक git stashपहले git pull। इस तरह आप चुपचाप अपने इतिहास को फिर से नहीं लिखेंगे (जो चुपचाप आपके कुछ काम छोड़ सकता है)।

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