इस चेतावनी से कैसे निपटें? "डायवर्जेंट शाखाओं को समेटने के तरीके को निर्दिष्ट किए बिना खींचने से हतोत्साहित किया जाता है"


163

git pull origin masterमुझे एक संदेश मिलने के बाद:

warning: Pulling without specifying how to reconcile divergent branches is
discouraged. You can squelch this message by running one of the following
commands sometime before your next pull:

  git config pull.rebase false  # merge (the default strategy)
  git config pull.rebase true   # rebase
  git config pull.ff only       # fast-forward only

You can replace "git config" with "git config --global" to set a default
preference for all repositories. You can also pass --rebase, --no-rebase,
or --ff-only on the command line to override the configured default per
invocation.

remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (4/4), 51.49 KiB | 850.00 KiB/s, done.

फिर पुल सफलतापूर्वक किया गया है। लेकिन फिर भी, मुझे इस संदेश के बारे में संदेह है।
इस मामले में सबसे अच्छी बात क्या है?


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

1
@WolfgangFahl, चेतावनी को किसी भी स्क्रिप्ट को प्रभावित नहीं करना चाहिए क्योंकि यह स्पष्ट रूप से परिवर्तित होने तक डिफ़ॉल्ट व्यवहार को बनाए रखना जारी रखता है। इसे नॉन-जीरो एग्जिट कोड को वापस लाने का कारण नहीं बनना चाहिए (यह एक चेतावनी है, त्रुटि नहीं)। कुछ सीआई / सीडी स्क्रिप्ट जो मैंने विभिन्न सर्वरों पर तैनात की हैं, अप्रभावित सफलता दर के साथ काम करना जारी रखती हैं।
क़ुम्बर

@Qumber - टिप्पणी के लिए धन्यवाद। Crontab प्रविष्टियाँ ई-मेल भेजना शुरू कर देंगी यदि आउटपुट ऐसा प्रतीत होता है कि नहीं था या एक साधारण grep के साथ फ़िल्टर किया जा सकता था। अप्रत्याशित आउटपुट के सभी प्रकार के दुष्प्रभाव हो सकते हैं।
वोल्फगैंग फाहल

@WolfgangFahl, प्रत्येक पुल का आमतौर पर कुछ अलग आउटपुट होता है। इसलिए, कोई भी लिपि जो केवल उसी पर निर्भर करती है, संभवतः बुरी तरह से लिखी गई है। इसके अलावा, किसी को व्यापक परीक्षण के बिना उत्पादन वातावरण को उन्नत नहीं करना चाहिए। मैं ठेस को बिल्कुल नहीं अपग्रेड करना पसंद करता हूं। इसके बजाय, मैं नवीनतम सब कुछ के साथ एक नया उदाहरण बनाता हूं, वहां अपने ऐप्स होस्ट करता हूं, सब कुछ परीक्षण करता हूं, और फिर इसका उत्पादन करता हूं।
क़मर

जवाबों:


192

इसके डिफॉल्ट मोड में, git fetch के लिए git पुल शॉर्टहैंड होता है, इसके बाद git मर्ज FETCH_HEAD होता है।

जब आप एक करते हैं git pull origin master, तो एक
git pullमर्ज करता है, जो अक्सर मर्ज कमिट बनाता है। इसलिए, डिफ़ॉल्ट रूप से, रिमोट से खींचना एक हानिरहित ऑपरेशन नहीं है: यह एक नया कमिट श बना सकता है जो पहले मौजूद नहीं था। यह व्यवहार किसी उपयोगकर्ता को भ्रमित कर सकता है, क्योंकि ऐसा क्या लगता है कि यह एक हानिरहित डाउनलोड ऑपरेशन होना चाहिए वास्तव में अप्रत्याशित तरीके से प्रतिबद्ध इतिहास को बदल देता है।

इससे बचने के लिए आपको चाहिए

git pull --ff-only

(या नहीं? यह देखने के लिए कि कौन आपकी आवश्यकताओं पर फिट बैठता है)

इसके साथ git pull --ff-only, Git आपकी शाखा को केवल तभी अपडेट करेगा, जब वह नया कमिट बनाए बिना "फास्ट-फॉरवर्ड" हो सकता है। यदि ऐसा नहीं किया जा सकता है, तो git pull --ff-onlyबस एक त्रुटि संदेश के साथ गर्भपात करें।

आप अपने Git क्लाइंट को हमेशा --ff-onlyडिफ़ॉल्ट रूप से उपयोग करने के लिए कॉन्फ़िगर कर सकते हैं , इसलिए आपको यह व्यवहार मिलता है भले ही आप कमांड-लाइन ध्वज को भूल जाएं:

git config --global pull.ff only

नोट: --globalध्वज आपकी मशीन पर सभी रिपॉजिटरी के लिए परिवर्तन लागू करता है। यदि आप चाहते हैं कि यह व्यवहार केवल उस रिपॉजिटरी के लिए हो जिसमें आप ध्वज को छोड़ें।

यहां से ले गए



यह चेतावनी Git 2.27 में जोड़ी गई, जैसा कि उनके उत्तर में जो ने बताया है।

यह पूरी चेतावनी जैसा दिखता है:

डाइवर्जेंट शाखाओं को समेटने के तरीके को निर्दिष्ट किए बिना खींचने से हतोत्साहित किया जाता है। आप अपने अगले पुल से कुछ समय पहले निम्न आदेशों में से एक को चलाकर इस संदेश को

रोक सकते हैं : git config pull.rebase false # मर्ज (डिफ़ॉल्ट रणनीति)
git config पुल .rebase true # rebase
git config पुल.ff # फास्ट-फॉरवर्ड

सभी रिपॉजिटरी के लिए डिफ़ॉल्ट प्राथमिकता सेट करने के लिए आप "git config" को "git config --global" से बदल सकते हैं। आप अपने इनवोकेशन पर कॉन्फ़िगर किए गए डिफॉल्ट को ओवरराइड करने के लिए कमांड लाइन पर --rebase, --no-rebase, या --ff-pass भी कर सकते हैं।

चेतावनी विकल्प के रूप में तीन आदेश प्रस्तुत करती है, ये सभी चेतावनी को दबा देंगे। लेकिन वे विभिन्न उद्देश्यों की पूर्ति करते हैं:

git config pull.rebase false     # merge (the default strategy)

यह डिफ़ॉल्ट व्यवहार रखता है और चेतावनी को दबा देता है।

git config pull.rebase true      # rebase

यह वास्तव में दूरस्थ शाखा के शीर्ष पर स्थित है, स्थानीय और दूरस्थ रूप से एकल शाखा को बनाए रखना (डिफ़ॉल्ट व्यवहार के विपरीत जहां दो अलग-अलग शाखाएं शामिल हैं - एक स्थानीय और दूसरी दूरस्थ पर - और, दोनों को मिलाने के लिए, एक मर्ज किया जाता है )।

git config pull.ff only          # fast-forward only

यह केवल तभी खींचता है जब स्थानीय शाखा तेजी से आगे बढ़ाई जा सकती है। यदि नहीं, तो यह बस एक त्रुटि संदेश के साथ आता है (और कोई भी हंगामा नहीं करता है)।


अपडेट करें:

अगर आपके पास Git 2.29या इसके बाद, अब आप सेट कर सकते हैं pull.ffकरने के लिए false, trueया onlyचेतावनी से छुटकारा पाने के।

git config pull.ff true

true- यह डिफ़ॉल्ट व्यवहार है। यदि संभव हो तो पुल तेजी से अग्रेषित किया जाता है, अन्यथा इसे विलय कर दिया जाता है।

git config pull.ff false

false - खींच कभी तेज़-अग्रेषित नहीं होता है, और हमेशा एक मर्ज बनाया जाता है।

git config pull.ff only

only - यदि संभव हो तो पुल तेजी से अग्रेषित किया जाता है, अन्यथा एक त्रुटि संदेश के साथ ऑपरेशन रद्द कर दिया जाता है।


8
मैं आपके उत्तर में लगाए गए समय और प्रयास की सराहना करता हूं, लेकिन स्पष्ट रूप से यह मेरे लिए अभी भी पूरी तरह से अक्षम है।
जेरेड नेडजेल

1
जैसा कि यहाँ पर टिप्पणी की गई है , यह चेतावनी कि शाखा वास्तव में विचलन कर रही है या नहीं, इससे प्रभावित नहीं होती है । प्रारंभिक "आपकी शाखा शायद विचलन कर रही है।" भ्रामक हो सकता है।
जो

3
मुझे कहना है, संदेश में तीन विकल्प ने मुझे संदेश को दबाने के लिए काम नहीं किया । हालाँकि यहाँ उत्तर ( git config --global pull.ff only) किया था
डिस्कजंकी

1
अहा! साभार @Qumber मैंने पहले ही प्रयास pull.rebase falseकिया था, लेकिन यह वर्णित के रूप में काम नहीं कर रहा था। यह हमेशा एक मर्ज कमेटी बना रहा था , और कभी तेजी से आगे नहीं बढ़ रहा था। मूल कारण यह था कि मेरी merge.ff falseसेटिंग थी। उस सेटिंग को साफ़ करने के बाद, यह फास्ट-फॉरवर्ड होना चाहिए जब यह होना चाहिए। डॉक्स यहां (लगभग git पुल डॉक्स के समान )
stwr667

1
आपने नीचे दिए गए Git 2.29 विकल्प को शामिल किया है, अच्छी बात। Upvoted।
VonC

64

यह Git 2.27 में जोड़ा गया एक नया चेतावनी है :

 * "git pull" issues a warning message until the pull.rebase
   configuration variable is explicitly given, which some existing
   users may find annoying---those who prefer not to rebase need to
   set the variable to false to squelch the warning.

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

  git config pull.rebase false  # merge (the default strategy)

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

  git config pull.rebase true   # rebase

यहां, gitदूरस्थ शाखा के शीर्ष पर अपने परिवर्तनों को पुन: उत्पन्न करने का प्रयास करेंगे। देखें कि मुझे git pull --rebase का उपयोग कब करना चाहिए? आप ऐसा क्यों चाहते हैं, इस पर अधिक विस्तार के लिए।

  git config pull.ff only       # fast-forward only

यदि तेजी से अग्रेषित मर्ज संभव नहीं है, gitतो आगे बढ़ने से इंकार कर देगा। के रूप में Git पुल के बीच अंतर --rebase और Git पुल --ff-केवल उद्धरण:

एक गैर-शून्य स्थिति के साथ विलय और बाहर निकलने से इनकार जब तक कि वर्तमान HEAD पहले से अद्यतित नहीं है या विलय को तेजी से आगे के रूप में हल किया जा सकता है


20
यह वास्तव में सबसे सही उत्तर है, क्योंकि यह बताता है कि लोग (मेरे जैसे) अचानक जीआईटी का उपयोग करने के लगभग एक दशक बाद इस चेतावनी को क्यों देख रहे हैं। हालांकि, यह उपयोगी होगा यदि प्रस्तावित विकल्पों पर कुछ मार्गदर्शन दिया गया था। उदाहरण के लिए, यह बताते हुए कि सेटिंग "।" को केवल "ओवरराइड" करने से आप इसे ओवरराइड करने से नहीं रोक सकते।
kdopen

बीच क्या अंतर है pull.rebase = trueऔर branch.autoSetupRebase = always?
टेकुमरा

1
@tekumara देखें stackoverflow.com/a/15935584/733345
जो

1
"जब आपकी शाखा में परिवर्तन होते हैं लेकिन दूरस्थ शाखा में मौजूद नहीं होते हैं।" तब मुझे ऐसा लगता है कि अगर यह मामला है तो केवल इस चेतावनी को फेंक देना चाहिए अगर मैं अपनी मेनलाइन खींच रहा हूं (और मेनलाइन का सही इस्तेमाल होता है) तो मुझे इस बारे में चिंता करने की जरूरत नहीं है।
कीथ टायलर

4
@ जो मैं आपके उत्तर को पसंद करता हूं, और लगता है कि यह सही उत्तर है, लेकिन आप यह देखते हैं कि क्या वास्तव में गिट ने कुछ किया है। मुझे लगता है कि इस चेतावनी को जारी करने का सही समय है अगर गिट को कुछ करना है, तो इस संदेश के साथ विफल होना चाहिए। इस संदेश के साथ न केवल स्पैम उपयोगकर्ताओं। फिर भी एक और चीज जो मेरे प्यार / घृणा के साथ रिश्ते को प्रभावित करती है।
जॉन वी

7

git config pull.ff onlyया समकक्ष git pull --ff-onlyसबसे सुरक्षित है। कारण यह है कि एक रिबेस इतिहास को अधिलेखित कर सकता है और किसी अन्य डेवलपर को उसी शाखा में बल देने पर कमिट्स का नुकसान हो सकता है।

लेकिन ये सभी मान्य हैं।


3

नोट: इससे पहले हमने " git pull" ( आदमी ) को चेतावनी दी थी कि जब उपयोगकर्ता यह न कहे कि इतिहास को विलय करने, विद्रोह करने या केवल तेजी से अग्रेषण स्वीकार करने की आवश्यकता है, लेकिन उन लोगों के लिए चेतावनी चालू हो गई जिन्होंने pull.ffकॉन्फ़िगरेशन चर सेट किया है।

Git 2.29 (Q4 2020) के साथ अब ऐसा नहीं है (अर्थ: कोई और अधिक चेतावनी )।

एलेक्स हेनरी ( ) द्वारा प्रतिबद्ध 54200ce (24 सितंबर 2020) देखें । (द्वारा विलय Junio सी Hamano - - में प्रतिबद्ध 299deea , 29 सितं, 2020)alexhenrie
gitster

pull: यदि pull.ffसेट किया गया है तो चेतावनी न दें

साइन-ऑफ-बाय: एलेक्स हेनरी

एक उपयोगकर्ता जो सेट करने के लिए पर्याप्त समझता है, को pull.ffअतिरिक्त निर्देशों की आवश्यकता नहीं है।

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