अपडेट को अस्वीकार कर दिया गया क्योंकि आपकी वर्तमान शाखा का सिरा पीछे है


154

मैं Git में नया हूं, इसलिए मुझे एक नौसिखिया की तरह व्यवहार करने के लिए स्वतंत्र महसूस करें।

हमारी वर्कफ़्लो ऐसी है। हमारे पास एक शाखा है जिसे devमैं यहां तक ​​पहुंचा सकता हूं origin/dev। जब हम परिवर्तन करते हैं, हम देव से एक शाखा बनाते हैं:

git चेकआउट -b FixForBug मूल / देव

अब मेरे पास एक शाखा है FixForBugजो ट्रैकिंग है (मुझे लगता है कि यह सही शब्द है) origin/dev। इस प्रकार, अगर मैं ऐसा करता हूं तो git pullयह नए बदलाव लाएगा origin/devजिसमें से महान है। अब, जब मैं अपने फिक्स के साथ समाप्त कर रहा हूं, तो मैं एक रिमोट ब्रांच पर धकेलता हूं जिसे समान चीज कहा जाता है।

पहले मैं किसी भी परिवर्तन को नीचे से origin/devहटाता हूं और एक छूट देता हूं:

गिट पुल - क्रेबसे

फिर मैं उसी नाम की एक दूरस्थ शाखा में बदलावों को आगे बढ़ाता हूं:

git पुश ओरिजिन FixForBug

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

पहली बार जब मैं ए git pushकरता हूं , यह ठीक काम करता है और रिमोट ब्रांच बनाता है। हालाँकि, अगर मैं दूसरी बार धक्का देता हूँ (चलो कोड-समीक्षा के दौरान कहते हैं, कोई समस्या बताता है), तो मुझे निम्नलिखित त्रुटि मिलती है:

त्रुटि: 'के लिए कुछ refs धक्का करने में विफल रहा https://github.limeade.info/Limeade/product.git ' संकेत: अपडेट अस्वीकार कर दिया गया है क्योंकि अपने वर्तमान शाखा की नोक संकेत के पीछे है: इसके दूरदराज के समकक्ष। फिर से पुश करने से पहले दूरस्थ परिवर्तनों (जैसे संकेत: 'गिट पुल ...') को एकीकृत करें। संकेत: विवरण के लिए 'git push-help' में 'फास्ट-फॉरवर्ड के बारे में नोट' देखें।

हालांकि, अगर मैं ऐसा करता हूं तो मैं git statusकहता हूं कि मैं origin/dev1 कमिट से आगे हूं (जो समझ में आता है) और अगर मैं संकेत का पालन करता हूं और दौड़ता हूं git pull, तो यह कहता है कि सब कुछ अप टू डेट है। मुझे लगता है कि यह इसलिए है क्योंकि मैं अपनी अपस्ट्रीम शाखा की तुलना में एक अलग शाखा पर जोर दे रहा हूं। मैं इस समस्या को चलाकर ठीक कर सकता हूं:

git push -f origin FixForBug

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

मेरे सवाल:

-fइस परिदृश्य में क्यों आवश्यक है? आमतौर पर जब आप कुछ करने के लिए मजबूर कर रहे हैं , यह इसलिए है क्योंकि आप कुछ गलत कर रहे थे या कम से कम मानक अभ्यास के खिलाफ। क्या मैं ऐसा कर रहा हूं, या यह दूरस्थ शाखा में कुछ गड़बड़ कर देगा या जो कोई भी अंततः मेरे सामान को देव में विलय करने के लिए परेशानी पैदा करेगा?


2
ऐसा लगता है कि आपके द्वारा प्राप्त संदेश यह कह रहा है कि दूरस्थ शाखा FixForBug आपकी स्थानीय शाखा FixForBug से आगे है। आपको उस दूरस्थ शाखा से परिवर्तनों को नीचे खींचना चाहिए और धक्का देने से पहले उन्हें अपनी स्थानीय शाखा में विलय कर देना चाहिए।
ch

4
@ शतक - तो मूल रूप से git pull origin FixForBugइससे पहले कि मैं इसे धकेलूं ? ठीक है कि समझ में आता है। एक उत्तर के रूप में जोड़ने के लिए स्वतंत्र महसूस करो!
माइक क्रिस्टीनसेन

जवाबों:


200

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


2
इस बहुत उपयोगी उत्तर के लिए धन्यवाद! :)
AIM_BLB

1
क्या आप इस बिंदु को स्पष्ट कर सकते हैं "आप हमेशा यह सुनिश्चित करना चाहेंगे कि आप धक्का देने से पहले एक पुल करें"? यह स्पष्ट है कि स्थानीय शाखा के रिबास के बाद "पुश-ऑफ़" क्यों आवश्यक है। इस मामले में, धक्का देने से पहले रिमोट को एक पुल wrt करने से स्थानीय की छूट नहीं होगी?
हरिपकन्नन

51

यह सुनिश्चित करने के लिए कि आपकी स्थानीय शाखा FixForBug दूरस्थ शाखा FixForBug से आगे नहीं है और पुश करने से पहले परिवर्तनों को मर्ज करें।

git pull origin FixForBug
git push origin FixForBug

2
ओपी ने कहा कि उन्होंने पहले से ही एक पुल पुल किया और धक्का देने की कोशिश की। आपका उत्तर ओपी के प्रश्न पर लागू नहीं होता है।
पैट्रिक

1
यह हमेशा एक बल धक्का से बचने के लिए बेहतर है। इसे साझा करने के लिए धन्यवाद!
एन किल्जर

16

यदि आप उपयोग करने से बचना चाहते हैं -f, तो आप बस उपयोग कर सकते हैं

git pull

के बजाय

git pull --rebase

गैर-रिबास परिवर्तनों को प्राप्त करेगा origin/devऔर उन्हें आपकी शाखा में विलय कर देगा FixForBug। तब, तुम दौड़ सकोगे

git push origin FixForBug

बिना उपयोग के -f


3
रिबेस हमारे यहाँ कार्य प्रवाह का हिस्सा है। मैं चिल्लाता हूँ अगर मैं ऐसा नहीं करता हूँ।
माइक क्रिस्टेनसेन

1
@ माइकक्रिस्टेंसन: ठीक है, ठीक है, तो निश्चित रूप से प्रलेखित प्रक्रिया का पालन करें। आप जो वर्णन करते हैं, उससे आपको उपयोग करने की आवश्यकता होगी -fक्योंकि आप अलग-अलग लोगों के साथ अपस्ट्रीम रिपॉजिटरी पर प्रतिबद्ध (एस) की जगह ले रहे हैं, जिनका इतिहास (विद्रोही) अलग है। यदि आप एक उत्पाद जैसे गेरिट का उपयोग करने वाले थे तो यह इस तरह के रिबासिंग कोड-रिव्यू वर्कफ़्लो का समर्थन करता है -fजब धक्का देने के बिना उपयोग करने के लिए । हम इस तरह से काम में Gerrit का उपयोग करते हैं और यह बहुत अच्छी तरह से काम करता है।
ग्रेग हेविगेल

15

the tip of your current branch is behind its remote counterpartइसका मतलब है कि स्थानीय रूप से आपके पास दूरस्थ शाखा में परिवर्तन नहीं हुए हैं। और git बताता है कि आप नए परिवर्तनों को आयात करते हैं REMOTEऔर इसे अपने कोड के साथ मर्ज करते हैं और फिर pushइसे दूरस्थ में।

आप स्थानीय रेपो () के साथ सर्वर में परिवर्तन को मजबूर करने के लिए इस कमांड का उपयोग कर सकते हैं।

git push -f origin master

-fटैग के साथ आप Remote Brach codeअपने कोड के साथ ओवरराइड करेंगे ।


6

जब मैंने संदेश का सामना किया, तो मैंने Azure DevOps के साथ जिस कमांड का उपयोग किया था, "अपडेट को अस्वीकार कर दिया गया क्योंकि आपकी वर्तमान शाखा का सिरा पीछे है" क्या यह कमांड है:

git पुल ओरिजिनल मास्टर

(या एक नए फ़ोल्डर के साथ शुरू कर सकते हैं और एक क्लोन कर सकते हैं) ।।

यह उत्तर प्रश्न का पता नहीं लगाता है, विशेष रूप से, कीफ ने इसका उत्तर दिया है, लेकिन यह प्रश्न के शीर्षक / शीर्षक पाठ का उत्तर देता है और यह Azure DevOps उपयोगकर्ताओं के लिए एक सामान्य प्रश्न होगा।

मैंने टिप्पणी की: "आप हमेशा यह सुनिश्चित करना चाहते हैं कि आप पुश करने से पहले एक पुल करें" केइफ के उत्तर में!

मैंने Git कमांड लाइन टूल के अलावा Git Gui टूल का भी उपयोग किया है।

(मुझे यकीन नहीं था कि गिट लाइन के भीतर कमांड लाइन कमांड "गिट पुल ओरिजिन मास्टर" के बराबर कैसे करें ताकि मैं ऐसा करने के लिए कमांड लाइन पर वापस आ जाऊं)।

एक आरेख जो विभिन्न क्रियाओं के लिए विभिन्न git कमांड दिखाता है जिसे आप शुरू करना चाहते हैं यह एक है:

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


4

यह सिर्फ मेरे साथ हुआ।

  • मैंने कल हमारे गुरु से एक अनुरोध किया।
  • मेरे सहयोगी आज इसकी समीक्षा कर रहे थे और उन्होंने देखा कि यह हमारी मास्टर शाखा के साथ सिंक से बाहर है, इसलिए मेरी मदद करने के इरादे से, उन्होंने मास्टर को मेरी शाखा में मिला दिया।
  • मुझे नहीं पता था कि उसने ऐसा किया।
  • फिर मैंने स्थानीय रूप से मास्टर को विलय कर दिया, इसे आगे बढ़ाने की कोशिश की, लेकिन यह विफल रहा। क्यों? क्योंकि मेरे सहकर्मी का मास्टर के साथ विलय एक अतिरिक्त प्रतिबद्ध था जो मेरे पास स्थानीय स्तर पर नहीं था !

समाधान: अपनी खुद की शाखा को नीचे खींचो ताकि मुझे वह अतिरिक्त प्रतिबद्धता मिले। फिर इसे मेरी दूरस्थ शाखा में वापस धकेलें

शाब्दिक रूप से मैंने अपनी शाखा पर जो किया वह था:

git pull
git push

3

इसी से मैंने अपनी समस्या का समाधान किया

मान लेते हैं कि अपस्ट्रीम ब्रांच वह है जिसे आपने फोर्क किया था और उत्पत्ति आपकी रेपो है और आप एमआर / पीआर को अपस्ट्रीम ब्रांच में भेजना चाहते हैं।

आपके पास पहले से ही 4 कमिट्स के बारे में कहते हैं और आपको मिल रहा है Updates were rejected because the tip of your current branch is behind.

मैंने जो किया था यह रहा

सबसे पहले, अपने सभी 4 हिट करें

git rebase -i HEAD~4

आपको pickउन पर लिखे गए कमिट की एक सूची मिलेगी । (एक संपादक में खोला गया)

उदाहरण

pick fda59df commit 1
pick x536897 commit 2
pick c01a668 commit 3
pick c011a77 commit 4

सेवा

pick fda59df commit 1
squash x536897 commit 2
squash c01a668 commit 3
squash c011a77 commit 4

उसके बाद, आप अपनी संयुक्त प्रतिबद्धता को बचा सकते हैं

आगे

आपको अपनी प्रतिबद्धता पर जोर देना होगा

ऐसे

git reset --soft HEAD~1
git stash

अब अपनी अपस्ट्रीम शाखा के साथ रिबेट करें

git fetch upstream beta && git rebase upstream/beta

अब अपने स्टैम्ड कमिट को पॉप करें

git stash pop

इन परिवर्तनों को करें और उन्हें धक्का दें

git add -A
git commit -m "[foo] - foobar commit"
git push origin fix/#123 -f

2

यह होना चाहिए क्योंकि प्रतिबद्ध आपके वर्तमान धक्का से आगे है।

1) git पुल उत्पत्ति "जिस शाखा को आप पुश करना चाहते हैं उसका नाम"

2) गिट रिबेस

अगर git rebase सफल होता है, तो अच्छा है। अन्यथा, आपने स्थानीय रूप से सभी मर्ज संघर्षों को हल कर लिया है और इसे तब तक जारी रखें जब तक कि रिमोट के साथ रिबेस सफल न हो।

3) गिट रिबेस - कॉन्टिन्यू


0

विजुअल स्टूडियो कोड के माध्यम से एक रिबास के बाद पुश करने की कोशिश करने पर मेरे पास यह मुद्दा था, मेरे मुद्दे को सिर्फ git आउटपुट विंडो से कमांड को कॉपी करके और विजुअल स्टूडियो कोड में टर्मिनल विंडो से निष्पादित करके हल किया गया था।

मेरे मामले में कमान कुछ इस तरह थी:

git push origin NameOfMyBranch:NameOfMyBranch

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