किन मामलों में `गिट पुल` हानिकारक हो सकता है?


409

मेरे पास एक सहकर्मी है जो दावा करता git pullहै कि हानिकारक है, और जब भी कोई इसका उपयोग करता है तो वह परेशान हो जाता है।

git pullआदेश अपने स्थानीय भंडार अद्यतन करने के लिए विहित तरीका हो रहा है। क्या git pullसमस्याएं पैदा करता है? यह क्या समस्याएं पैदा करता है? क्या एक गिट रिपॉजिटरी को अपडेट करने का एक बेहतर तरीका है?



8
या आप git pull --rebaseइस रणनीति को नई शाखाओं के लिए डिफ़ॉल्ट के रूप में सेट कर सकते हैं git config branch.autosetuprebase
नॉकएक्स

4
knoopx के पास यह अधिकार है, --rebaseध्वज को git pullरिमोट के साथ स्थानीय सिंक्रनाइज़ करने के लिए जोड़ना और फिर अपडेट किए गए स्थानीय के शीर्ष पर अपने स्थानीय परिवर्तनों को फिर से खेलना । फिर जब आप सभी को धक्का देते हैं तो आप रिमोट के अंत में अपने नए कमिट्स को जोड़ रहे हैं। बहुत साधारण।
हीथ लिली

4
धन्यवाद @BenMcCormick मैंने पहले ही ऐसा कर लिया है, लेकिन सवाल की वैधता के बारे में चर्चा सवाल के नीचे इन टिप्पणियों में हो रही है। और मुझे लगता है कि एक प्रश्न पूछने के लिए एक मंच बनाने के लिए आपकी व्यक्तिगत राय पेश करने के लिए तथ्य यह है कि एसओ की प्रश्नोत्तर संरचना वास्तव में क्या है।
mcv

4
@ रीचर्डहेनसेन, यह सिर्फ बिंदु प्रणाली को धोखा देने का एक तरीका है, विशेष रूप से आपके उत्तर के साथ टोन में इतना कठोर अंतर और इतने कम समय का अंतर। Q & A के अपने मॉडल का उपयोग करते हुए, हम सभी बस सवाल पूछ सकते हैं और अपने पिछले ज्ञान का उपयोग करके खुद को जवाब दे सकते हैं। उस बिंदु पर, आपको बस एक ब्लॉग पोस्ट लिखने पर विचार करना चाहिए क्योंकि यह कई गुना अधिक उपयुक्त है। एक प्रश्नोत्तर विशेष रूप से अन्य लोगों के ज्ञान की तलाश करता है। एक ब्लॉग पोस्ट अपना खुद का प्रदर्शन करती है।
जोश ब्राउन

जवाबों:


546

सारांश

डिफ़ॉल्ट रूप से, git pullमर्ज कमिट बनाता है जो कोड इतिहास में शोर और जटिलता जोड़ता है। इसके अलावा, pullयह सोचना आसान नहीं है कि आने वाले परिवर्तनों से आपके परिवर्तन कैसे प्रभावित हो सकते हैं।

जब git pullतक यह केवल तेजी से अग्रेषित मर्ज करता है, तब तक यह कमांड सुरक्षित रहता है। यदि git pullकेवल फास्ट-फ़ॉरवर्ड मर्ज करने के लिए कॉन्फ़िगर किया गया है और जब फ़ॉर-फ़ॉरवर्ड मर्ज संभव नहीं है, तो Git एक त्रुटि के साथ बाहर निकल जाएगा। इससे आपको आने वाले कमिट्स का अध्ययन करने का अवसर मिलेगा, इस बारे में सोचें कि वे आपके स्थानीय कमेंट्स को कैसे प्रभावित कर सकते हैं, और कार्रवाई का सबसे अच्छा तरीका तय करें (मर्ज, रिबेस, रीसेट, आदि)।

Git 2.0 और नए के साथ, आप चला सकते हैं:

git config --global pull.ff only

डिफ़ॉल्ट व्यवहार को केवल तेज़ी से अग्रेषित करने के लिए परिवर्तित करना। 1.6.6 और 1.9.x के बीच Git संस्करणों के साथ आपको टाइपिंग की आदत डालनी होगी:

git pull --ff-only

हालांकि, Git के सभी संस्करणों के साथ, मैं git upइस तरह से एक उपनाम को कॉन्फ़िगर करने की सलाह देता हूं :

git config --global alias.up '!git remote update -p; git merge --ff-only @{u}'

और का उपयोग कर git upके बजाय git pull। मैं इस उपनाम को पसंद करता हूं git pull --ff-onlyक्योंकि:

  • यह Git के सभी (गैर-प्राचीन) संस्करणों के साथ काम करता है,
  • यह सभी अपस्ट्रीम शाखाओं को प्राप्त करता है (न केवल उस शाखा को जो आप वर्तमान में काम कर रहे हैं), और
  • यह पुरानी origin/*शाखाओं को साफ करता है जो अब ऊपर की ओर मौजूद नहीं हैं।

के साथ समस्याएं git pull

git pullयह ठीक से उपयोग किया जाता है तो बुरा नहीं है। Git में कई हालिया परिवर्तनों ने इसे git pullठीक से उपयोग करना आसान बना दिया है , लेकिन दुर्भाग्य से एक सादे के डिफ़ॉल्ट व्यवहार git pullमें कई समस्याएं हैं:

  • यह इतिहास में गैरजरूरी गैर-परिचय का परिचय देता है
  • यह आकस्मिक रूप से कमिट करना आसान बनाता है जो जानबूझकर अपस्ट्रीम से बाहर किए गए थे
  • यह अप्रत्याशित तरीके से आपकी कार्य निर्देशिका को संशोधित करता है
  • किसी और के काम की समीक्षा करने के लिए आप जो कर रहे हैं, उसे रोकना कष्टप्रद है git pull
  • यह दूरस्थ शाखा पर सही ढंग से रिबेस करने के लिए कठिन बनाता है
  • यह दूरस्थ रेपो में हटा दी गई शाखाओं को साफ नहीं करता है

इन समस्याओं को नीचे विस्तार से वर्णित किया गया है।

नॉनलाइनियर हिस्ट्री

डिफ़ॉल्ट रूप से, git pullकमांड git fetchउसके बाद चलने के बराबर है git merge @{u}। यदि स्थानीय रिपॉजिटरी में अप्रकाशित कमिट हैं, तो मर्ज का हिस्सा git pullमर्ज कमिट बनाता है।

मर्ज कमिट्स के बारे में कुछ भी बुरा नहीं है, लेकिन वे खतरनाक हो सकते हैं और उन्हें सम्मान के साथ माना जाना चाहिए:

  • मर्ज कमिट्स को जांचना स्वाभाविक है। यह समझने के लिए कि एक मर्ज क्या कर रहा है, आपको सभी माता-पिता के मतभेदों को समझना होगा। एक पारंपरिक अंतर इस बहुआयामी जानकारी को अच्छी तरह से व्यक्त नहीं करता है। इसके विपरीत, सामान्य आवागमन की एक श्रृंखला की समीक्षा करना आसान है।
  • मर्ज संघर्ष रिज़ॉल्यूशन मुश्किल है, और गलतियाँ अक्सर लंबे समय तक नहीं चल पाती हैं क्योंकि मर्ज कमिट की समीक्षा करना मुश्किल होता है।
  • मर्ज चुपचाप नियमित रूप से आने वाले प्रभावों को प्रभावित कर सकते हैं। कोड अब वृद्धिशील कमिट का योग नहीं है, जो वास्तव में बदल गया है के बारे में गलतफहमी के लिए अग्रणी है।
  • मर्ज किए जाने से कुछ निरंतर एकीकरण योजनाएं बाधित हो सकती हैं (उदाहरण के लिए, मान लिया गया अधिवेशन के तहत केवल पहला-मूल पथ ऑटो-बिल्ड करता है, जो दूसरे माता-पिता प्रगति में अपूर्ण कार्यों की ओर इशारा करते हैं)।

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

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

git pullमर्ज के बजाय रिबेस को कॉन्फ़िगर करना संभव है , लेकिन इसमें समस्याएं भी हैं (बाद में चर्चा की गई)। इसके बजाय, git pullकेवल फास्ट-फॉरवर्ड मर्ज करने के लिए कॉन्फ़िगर किया जाना चाहिए।

रिबेड-आउट कमिट्स का पुन: निर्माण

मान लीजिए कि कोई शाखा को विद्रोह करता है और बल उसे धक्का देता है। यह आम तौर पर नहीं होना चाहिए, लेकिन यह कभी-कभी आवश्यक होता है (उदाहरण के लिए, 50GiB लॉग फ़ाइल को हटाने के लिए जो गलती से कॉमेड और धक्का दिया गया था)। द्वारा किया गया git pullमर्ज अपस्ट्रीम ब्रांच के नए वर्जन को पुराने वर्जन में मर्ज कर देगा जो अभी भी आपके स्थानीय रिपॉजिटरी में मौजूद है। यदि आप परिणाम को आगे बढ़ाते हैं, तो पिच कांटे और मशालें आपके रास्ते में आने लगेंगी।

कुछ तर्क दे सकते हैं कि वास्तविक समस्या बल अद्यतन है। हां, जब भी संभव हो, बल धक्का से बचने के लिए आमतौर पर सलाह दी जाती है, लेकिन वे कभी-कभी अपरिहार्य होते हैं। डेवलपर्स को बल अद्यतन से निपटने के लिए तैयार रहना चाहिए, क्योंकि वे कभी-कभी होते हैं। इसका मतलब यह है कि नेत्रहीन पुराने के माध्यम से एक साधारण में विलय नहीं करता है git pull

आश्चर्य कार्य निर्देशिका संशोधन

जब तक काम करने वाली निर्देशिका या इंडेक्स जैसा नहीं होगा तब तक भविष्यवाणी करने का कोई तरीका नहीं git pullहै। इससे पहले कि आप कुछ और कर सकें, इसे आपस में मिलाने के लिए मर्ज संघर्ष हो सकता है, यह आपकी वर्किंग डायरेक्टरी में 50GiB लॉग फाइल को पेश कर सकता है क्योंकि किसी ने गलती से इसे धक्का दे दिया, हो सकता है कि यह उस डायरेक्टरी का नाम बदल दे, जिसमें आप काम कर रहे हैं, आदि।

git remote update -p(या git fetch --all -p) आपको मर्ज या रिबेस करने का निर्णय लेने से पहले अन्य लोगों के कमिट्स को देखने की अनुमति देता है, जिससे आप कार्रवाई करने से पहले एक योजना बना सकते हैं।

अन्य लोगों की कमिटियों की समीक्षा करने में कठिनाई

मान लीजिए कि आप कुछ बदलाव करने के लिए बीच में हैं और कोई व्यक्ति चाहता है कि आप कुछ कमिट्स की समीक्षा करें, जिन्हें उन्होंने अभी-अभी पुश किया है। git pull's मर्ज (या रिबेस) ऑपरेशन काम करने वाली डायरेक्टरी और इंडेक्स को संशोधित करता है, जिसका मतलब है कि आपकी वर्किंग डायरेक्टरी और इंडेक्स साफ होना चाहिए।

आप उपयोग कर सकते हैं git stashऔर फिर git pull, लेकिन जब आप समीक्षा करते हैं तो आप क्या करते हैं? जहाँ आप थे, वहाँ वापस जाने के लिए आपको मर्ज द्वारा बनाए गए git pullऔर स्लैश को लागू करना होगा।

git remote update -p(या git fetch --all -p) कार्य निर्देशिका या सूचकांक को संशोधित नहीं करता है, इसलिए किसी भी समय चलाना सुरक्षित है - भले ही आपने मंचन किया हो और / या अप्रतिबंधित परिवर्तन किए हों। आप जो कर रहे हैं उस पर विराम लगा सकते हैं और आप जिस काम पर काम कर रहे हैं उसे खत्म करने या खत्म करने की चिंता किए बिना किसी और की प्रतिबद्धता की समीक्षा करें। git pullआपको वह लचीलापन नहीं देता है।

रिमोट ब्रांच पर रिबासिंग

एक सामान्य Git उपयोग पैटर्न को git pullनवीनतम परिवर्तनों को लाने के लिए करना है, इसके बाद git rebase @{u}मर्ज किए गए कमिट को समाप्त करने के लिए git pull। यह आम पर्याप्त है कि Git कुछ कॉन्फ़िगरेशन को बताकर एक ही चरण के लिए इन दो चरणों कम करने की क्षमता है git pullकिसी मर्ज के बजाय एक रिबेस प्रदर्शन करने के लिए (देखें branch.<branch>.rebase, branch.autosetuprebase, और pull.rebaseविकल्प)।

दुर्भाग्यवश, यदि आपके पास कोई अनपेक्षित मर्ज है, जिसे आप संरक्षित करना चाहते हैं (जैसे, एक धक्का सुविधा शाखा को एक में विलय करना master), तो न तो रिबास-पुल ( सेट के git pullसाथ ) और न ही मर्ज-पुल (डिफ़ॉल्ट व्यवहार) के बाद रिबास काम करेगा। ऐसा इसलिए है क्योंकि विकल्प के बिना मर्ज को समाप्त कर देता है (यह DAG को रेखीय करता है) । रीबेस-पुल ऑपरेशन को मर्ज को संरक्षित करने के लिए कॉन्फ़िगर नहीं किया जा सकता है, और मर्ज-पुल मर्ज-पुल के कारण मर्ज को समाप्त नहीं करेगा। अद्यतन: Git v1.8.5 जोड़ा गया और । अपस्ट्रीम के आने के बाद ऐसा करने का कारण बनता है। ( हेड-अप के लिए कवक के लिए धन्यवाद !)branch.<branch>.rebasetruegit pullgit rebase--preserve-mergesgit rebase -p @{u}git pull --rebase=preservegit config pull.rebase preservegit pullgit rebase --preserve-merges

हटाए गए शाखाओं की सफाई

git pullदूरस्थ रिपॉजिटरी से हटाए गए शाखाओं के अनुरूप दूरस्थ ट्रैकिंग शाखाएं नहीं छंटती हैं। उदाहरण के लिए, यदि कोई fooदूरस्थ रेपो से शाखा को हटाता है, तो आप अभी भी देखेंगे origin/foo

यह उपयोगकर्ताओं को गलती से मारे गए शाखाओं को फिर से जीवित करने की ओर जाता है क्योंकि उन्हें लगता है कि वे अभी भी सक्रिय हैं।

एक बेहतर विकल्प: के git upबजाय का उपयोग करेंgit pull

इसके बजाय git pull, मैं निम्नलिखित git upउपनाम बनाने और उपयोग करने की सलाह देता हूं :

git config --global alias.up '!git remote update -p; git merge --ff-only @{u}'

यह उपनाम सभी अपस्ट्रीम शाखाओं (मृत शाखाओं को काटता है) से सभी नवीनतम आवागमन डाउनलोड करता है और स्थानीय शाखा को अपस्ट्रीम शाखा पर नवीनतम प्रतिबद्ध करने के लिए तेजी से अग्रेषित करने का प्रयास करता है। यदि सफल हुआ, तो स्थानीय कमिट नहीं थे, इसलिए मर्ज संघर्ष का कोई जोखिम नहीं था। यदि स्थानीय (अप्रकाशित) कमिट हैं, तो फास्ट-फ़ॉर्वर्ड आगे विफल हो जाएगा, जिससे आपको कार्रवाई से पहले अपस्ट्रीम कमिट्स की समीक्षा करने का अवसर मिलेगा।

यह अभी भी अप्रत्याशित तरीके से आपकी कामकाजी निर्देशिका को संशोधित करता है, लेकिन केवल अगर आपके पास कोई स्थानीय परिवर्तन नहीं है। इसके विपरीत git pull, git upआप एक मर्ज संघर्ष को ठीक करने की उम्मीद करते हुए आपको कभी नहीं छोड़ेंगे।

एक अन्य विकल्प: git pull --ff-only --all -p

निम्नलिखित उपरोक्त git upउपनाम का एक विकल्प है :

git config --global alias.up 'pull --ff-only --all -p'

इस संस्करण में git upपिछले git upउपनाम के समान व्यवहार है , इसके अलावा:

  • यदि आपकी स्थानीय शाखा एक अपस्ट्रीम शाखा से कॉन्फ़िगर नहीं है, तो त्रुटि संदेश थोड़ा अधिक गूढ़ है
  • यह एक अनिर्दिष्ट सुविधा ( -pतर्क, जो इसे पारित किया गया है fetch) पर निर्भर करता है जो भविष्य के Git के संस्करणों में बदल सकता है

अगर आप Git 2.0 या नया चला रहे हैं

Git 2.0 और नए के साथ आप git pullकेवल डिफ़ॉल्ट रूप से फास्ट-फॉरवर्ड मर्ज करने के लिए कॉन्फ़िगर कर सकते हैं :

git config --global pull.ff only

यह git pullकार्य करने का कारण बनता है git pull --ff-only, लेकिन यह अभी भी सभी अपस्ट्रीम कमिट नहीं करता है या पुरानी origin/*शाखाओं को साफ नहीं करता है, इसलिए मैं अभी भी पसंद करता हूं git up


6
@ ब्रायनज़: git remote update -pके बराबर है git fetch --all -p। मैं टाइप करने की आदत में हूँ git remote update -pक्योंकि एक समय पर एक विकल्प fetchनहीं था -p। अग्रणी के बारे में !, का विवरण देखने alias.*में git help config। इसमें कहा गया है, "यदि उर्फ ​​विस्तार को विस्मयादिबोधक बिंदु के साथ उपसर्ग किया जाता है, तो इसे शेल कमांड के रूप में माना जाएगा।"
रिचर्ड हैनसेन

13
Git 2.0 एक pull.ffकॉन्फ़िगरेशन को जोड़ता है जो एलियास के बिना एक ही चीज़ को प्राप्त करने के लिए प्रकट होता है।
डैनी थॉमस

51
कुछ कारणों से लगता है जैसे "पुल समस्याओं का कारण बन सकता है जब अन्य पागल सामान करते हैं"। नहीं, यह पागल सामान है, जो समस्याओं का कारण बनने वाले अपस्ट्रीम रेपो से बाहर जाने के लिए प्रतिबद्ध है। IMO रिबास केवल तभी सुरक्षित होता है जब आप इसे स्थानीय स्तर पर करते हैं जो अभी तक धक्का नहीं दिया गया है। जैसे, उदाहरण के लिए, जब आप धक्का देने से पहले खींचते हैं, तो स्थानीय कमिट्स को रिबास करने से आपके इतिहास को रैखिक रखने में मदद मिलती है (हालांकि रैखिक इतिहास बड़ा नहीं है)। फिर भी, git upएक दिलचस्प विकल्प की तरह लगता है।
mcv

16
आपके अधिकांश बिंदु इसलिए हैं क्योंकि आप कुछ गलत कर रहे हैं: आप अपनी स्वयं की कार्य शाखा में कोड की समीक्षा करने का प्रयास कर रहे हैं । यह एक अच्छा विचार नहीं है, बस एक नई शाखा बनाएं, पुल --rebase = संरक्षित करें और फिर उस शाखा को टॉस करें (या यदि आप चाहें तो इसे मर्ज करें)।
फनकस्टर

5
@ funkaster की बात यहाँ बहुत मायने रखती है, विशेष रूप से फिर से: "अन्य लोगों के कमिट की समीक्षा करने में कठिनाई"। यह अधिकांश उपयोगकर्ताओं द्वारा उपयोग किए जाने वाले समीक्षा प्रवाह नहीं है, यह कुछ ऐसा है जिसे मैंने कभी भी कहीं भी अनुशंसित नहीं देखा है और यह शीर्ष के नीचे वर्णित अनावश्यक अतिरिक्त कार्य का कारण है, नहीं git pull
बेन रेगेन्स्पैन

195

HackerNews पर उठने वाली चर्चा से खींचा गया मेरा जवाब :

मुझे लगता है कि हेडलाइंस लॉ के हेडलाइन का उपयोग करके इस सवाल का जवाब देने का प्रलोभन: क्यों git pullहानिकारक माना जाता है? यह नहीं है।

  • गैरकानूनी नहीं आंतरिक रूप से खराब हैं। यदि वे वास्तविक इतिहास का प्रतिनिधित्व करते हैं तो वे ठीक हैं।
  • दुर्घटनाओं का आकस्मिक पुनर्मिलन गलत तरीके से ऊपर की ओर जाने वाले पुनरुत्पादन इतिहास के गलत तरीके से पुनर्लेखन का परिणाम है। जब इतिहास कई रिपोज के साथ दोहराया जाता है तो आप इतिहास को दोबारा नहीं लिख सकते।
  • कामकाजी निर्देशिका को संशोधित करना एक अपेक्षित परिणाम है; डेबिटेबल यूटिलिटी के नाम पर, जैसे कि hg / monotone / darcs / other_dvcs_predating_git के व्यवहार का सामना करना पड़ता है, लेकिन फिर आंतरिक रूप से खराब नहीं होता है।
  • मर्ज के लिए दूसरों के काम की समीक्षा करने की आवश्यकता है, और फिर से गिट पुल पर एक अपेक्षित व्यवहार है। यदि आप मर्ज नहीं करना चाहते हैं, तो आपको गिट भ्रूण का उपयोग करना चाहिए। फिर, यह पिछले लोकप्रिय dvcs की तुलना में git का एक आइडिओसिन्क्रैसी है, लेकिन यह अपेक्षित व्यवहार है और आंतरिक खराब नहीं है।
  • एक दूरस्थ शाखा के खिलाफ फिर से निर्माण करना कठिन है। जब तक आपको पूरी तरह से आवश्यकता न हो, इतिहास को फिर से न लिखें। मैं अपने जीवन के लिए एक (नकली) रैखिक इतिहास की इस खोज को नहीं समझ सकता
  • शाखाओं की सफाई नहीं करना अच्छा है। प्रत्येक रेपो जानता है कि वह क्या धारण करना चाहता है। Git में गुरु-दास संबंधों की कोई धारणा नहीं है।

13
मैं सहमत हूँ। स्वाभाविक रूप से हानिकारक कुछ भी नहीं है git pull। हालांकि, यह कुछ हानिकारक प्रथाओं के साथ संघर्ष कर सकता है, जैसे कि इतिहास को फिर से लिखने के लिए कड़ाई से आवश्यक है। लेकिन गिट लचीले होते हैं, इसलिए यदि आप इसे एक अलग तरीके से उपयोग करना चाहते हैं, तो हर तरह से। लेकिन ऐसा इसलिए है क्योंकि आप (अच्छी तरह से, @ रिचर्ड हेन्सन) गिट में कुछ असामान्य करना चाहते हैं, और इसलिए नहीं कि git pullहानिकारक है।
एमसी

28
अधिक सहमत नहीं हो सका। लोगों के लिए वकालत कर रहे हैं git rebaseऔर विचार git pullहानिकारक? वास्तव में?
विक्टर मोरोज़

10
यह देखना अच्छा होगा कि कोई व्यक्ति आपकी धुरी के रूप में नैतिकता के साथ एक ग्राफ बनाये और git कमांड को अच्छे, बुरे, या कहीं-कहीं के बीच वर्गीकृत करे। यह चार्ट डेवलपर्स के बीच भिन्न होता है, हालांकि यह बहुत से उपयोगों के बारे में कहता है।
माइकेल

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

4
तो इससे आपको क्या पता चलता है कि अगर कोई किसी और से या आसपास के रास्ते से कुछ सेकंड पहले ही पुल बना ले तो? मुझे लगता है कि यह सिर्फ शोर है और वास्तव में प्रासंगिक इतिहास को ही गलत ठहरा रहा है। इससे इतिहास का मूल्य भी कम होता है। एक अच्छा इतिहास होना चाहिए) स्वच्छ और बी) वास्तव में महत्वपूर्ण इतिहास है।
डेविड ओंगारो

26

यदि आप सही तरीके से गिट का उपयोग कर रहे हैं तो यह हानिकारक नहीं माना जाता है। मैं देखता हूं कि यह आपके उपयोग के मामले को नकारात्मक रूप से कैसे प्रभावित करता है, लेकिन आप साझा इतिहास को संशोधित न करके केवल समस्याओं से बच सकते हैं।


10
इस बारे में विस्तार से बताने के लिए: यदि हर कोई अपनी शाखा पर काम करता है (जो कि मेरी राय में git का उपयोग करने का उचित तरीका है), git pullकिसी भी तरह का मुद्दा नहीं है। जीआईटी में ब्रांचिंग सस्ती है।
एलेक्सक्यूव्यू

18

स्वीकृत उत्तर दावा करता है

मर्ज को संरक्षित करने के लिए रिबास-पुल ऑपरेशन को कॉन्फ़िगर नहीं किया जा सकता है

लेकिन Git 1.8.5 के रूप में , जो उस उत्तर को पोस्ट करता है, आप कर सकते हैं

git pull --rebase=preserve

या

git config --global pull.rebase preserve

या

git config branch.<name>.rebase preserve

डॉक्स का कहना है

जब reb गिट रिबास ’ preserve,भी पास हो --preserve-mergesजाए ताकि स्थानीय रूप से प्रतिबद्ध मर्ज कमिट को 'गिट पुल’ चलाकर चपटा न किया जाए।

इस पिछली चर्चा में अधिक विस्तृत जानकारी और चित्र हैं: git pull --rebase --preserve-merges । यह भी बताता है कि क्यों git pull --rebase=preserveसमान नहीं हैgit pull --rebase --preserve-merges , जो सही काम नहीं करता है।

यह अन्य पिछली चर्चा बताती है कि वास्तव में रिबेज का संरक्षित-विलय वैरिएंट क्या करता है, और यह एक नियमित रिबेज की तुलना में बहुत अधिक जटिल कैसे है: वास्तव में गिट के "रीबेस - लेबर-मर्ज" क्या करते हैं (और क्यों?)


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