गैर-फास्ट-फॉरवर्ड अस्वीकार कर दिया


88

मुझे ऐसा लगता है कि यह प्रश्न कई बार पूछा गया है, लेकिन समाधान आम तौर पर "मैंने निर्देशिका को हटा दिया है और नए सिरे से अपने काम को फिर से किया है।" मैंने एक कमिट किया और धक्का दिया लेकिन महसूस किया कि मैंने कमिट मैसेज में गलत टिकट नंबर का उल्लेख किया है। इसलिए मैंने एसओ को त्वरित समाधान के लिए देखा और टर्मिनल में निम्नलिखित टाइपिंग को समाप्त किया:

$ git reset --soft HEAD^
$ git commit -m "... correct message ..."

एकमात्र समस्या मुझे निम्न त्रुटि संदेश मिल रहा है:

To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes before pushing again.  See the 'Note about
fast-forwards' section of 'git push --help' for details.

मैं git-flow मॉडल का उपयोग कर रहा हूं और विकसित शाखा पर काम कर रहा हूं। मैं कैसे फिर से चीजों को मर्ज कर सकता हूं ताकि गिट को फिर से खुश किया जा सके?


जवाबों:


52

बल git push:

git push origin +develop

24
यह एक समाधान है, लेकिन ब्रायन कैंपबेल की टिप्पणी पढ़ें ताकि आप समझ सकें कि आप इसका उपयोग करने से पहले क्या कर रहे हैं।
Thelem

5
git पुश ओरिजिन + मास्टर
अनिकेत ठाकुर

ब्रायन कैंपबेल के उत्तर के बारे receive.denyNonFastForwardsमें भी नोट देखें : या पर्याप्त रूप से बलशाली नहीं हो सकते हैं, यह इस बात पर निर्भर करता है कि वे कैसे हैं - उन्होंने अपने गिट रिपॉजिटरी को कॉन्फ़िगर किया है। +--force
torek

174

आप धक्का तो एक सर्वर के लिए प्रतिबद्ध है, और फिर पुनर्लेखन कि स्थानीय स्तर पर (साथ प्रतिबद्ध git reset, git rebase, git filter-branch, या किसी अन्य इतिहास हेरफेर), और फिर धक्का दिया कि पुनः सर्वर को वापस अप के लिए प्रतिबद्ध है, तो आप किसी और को जो खींच लिया था पेंच होगा। यहाँ एक उदाहरण है; आपने ए को प्रतिबद्ध किया है, और इसे सर्वर पर धकेल दिया है।

- * - * - ए <- गुरु

- * - * - ए <- मूल / गुरु

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

-*-*-ए
    \
     A '<- गुरु

- * - * - ए <- मूल / गुरु

अगर कोई और, फ्रेड कहते हैं, नीचे खींचता है master सर्वर से है जब आप ऐसा कर रहे हैं, तो उनके पास ए का संदर्भ होगा, जिसे वे काम करना शुरू कर सकते हैं:

- * - * - ए '<- गुरु

- * - * - ए <- मूल / गुरु

- * - * - AB <- fred / master

अब यदि आप अपने A 'को मूल / गुरु में धकेलने में सक्षम थे, जो एक गैर-फास्ट-फॉरवर्ड बनाता है, तो इसके इतिहास में ए नहीं होगा। इसलिए यदि फ्रेड ने फिर से खींचने की कोशिश की, तो उसे अचानक विलय करना होगा, और ए कमिट को फिर से पेश करना होगा:

- * - * - ए '<- गुरु

- * - * - ए <- मूल / गुरु

- * - * - AB- \ 
    \ * <- फ्रेड / मास्टर
     ए'--/

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

इसलिए, आम तौर पर रेपो पर इतिहास को बदलने के लिए यह एक अच्छा विचार नहीं है कि अन्य लोग किस से खींचते हैं। यदि, हालांकि, आपको पता है कि कोई और उस रेपो से नहीं खींच रहा है (उदाहरण के लिए, यह आपका अपना निजी रेपो है, या आपके पास केवल एक अन्य डेवलपर है जो इस परियोजना पर काम कर रहा है जिसे आप आसानी से समन्वयित कर सकते हैं), तो आप जबरन कर सकते हैं रन करके अपडेट करें:

git push -f

या

git push origin +master

ये दोनों एक गैर-फास्ट-फॉरवर्ड पुश के लिए चेक को अनदेखा करेंगे, और अपडेट करेंगे कि आपके नए ए 'संशोधन के लिए सर्वर पर क्या है, ए संशोधन को छोड़ दें ताकि यह अंततः कचरा एकत्र हो जाए।

यह संभव है कि बल धक्का पूरी तरह से receive.denyNonFastForwardsकॉन्फ़िगर विकल्प के साथ अक्षम हो । यह विकल्प साझा किए गए रिपॉजिटरी पर डिफ़ॉल्ट रूप से सक्षम है। उस मामले में, यदि आप वास्तव में, वास्तव में एक धक्का देना चाहते हैं, तो सबसे अच्छा विकल्प शाखा को हटाना और इसे फिर से बनाना है git push origin :master; git push origin master:master। हालांकि, denyNonFastForwardsविकल्प एक कारण के लिए सक्षम है, जो ऊपर वर्णित है; एक साझा भंडार पर, इसका मतलब है कि अब हर कोई जो इसका उपयोग करता है, यह सुनिश्चित करने की आवश्यकता है कि वे नए इतिहास पर फिर से काम करें।

एक साझा भंडार पर, आम तौर पर शीर्ष पर नए कमिट्स को धकेलना बेहतर होता है जो भी समस्या है उसे ठीक करें; आप उन git revertकमिट्स को जेनरेट करने के लिए उपयोग कर सकते हैं जो पिछले कमिट्स के बदलावों को पूर्ववत कर देगा।


महान शिक्षा, और आपको अंत में अधिकार मिला, लेकिन मेरी शाखा को विकसित (गिट-फ्लो के आधार पर) कहा जाता था, और दूसरे व्यक्ति ने +developअपनी कमान में डाल दिया - इसलिए चेक उसके पास जाता है। आपको वैसे भी एक खगोलीय संख्या मिली है: P
rynmrtn

7
या git push --force
बेनेट मैकलेवे

3
@Panique आप एक ही समय में एक-दूसरे को अवरुद्ध किए बिना, एक ही समय में एक बड़े, जटिल कोडबेस पर कई लोगों को काम करने की अनुमति देने की कोशिश कर रहे हैं (एक समय में केवल एक व्यक्ति को इस पर काम करने की अनुमति देता है), और एक दूसरे पर ओवरराइट किए बिना। आपको प्रत्येक व्यक्ति को स्वतंत्र रूप से परिवर्तन करने और उन परिवर्तनों को मर्ज करने में सक्षम होने की आवश्यकता है। विलय (चाहे मैनुअल या स्वचालित) अप्रत्याशित समस्याओं का परिचय दे सकता है; इसलिए आप यह सुनिश्चित करना चाहते हैं कि यदि गलत हुआ तो क्या होगा, यह जानने के लिए आप अधिक से अधिक जानकारी हासिल करना चाहते हैं। यह आंतरिक रूप से जटिल है; यह गंदा नहीं है, बस एक कठिन समस्या है।
ब्रायन कैंपबेल

मैंने दूरस्थ रेपो इतिहास को फिर से लिखने के लिए एफ और + विकल्प दोनों की कोशिश की। दोनों विकल्पों में, मैं गैर-फास्ट-फॉरवर्ड मुद्दे में भाग गया। [5:05 PM] $ git पुश -f ओरिजिन लोकल_ए: रिमोट_ए काउंटिंग ऑब्जेक्ट्स: 35, किया। 2 थ्रेड्स का उपयोग करते हुए डेल्टा संपीड़न। संपीड़ित वस्तुएं: 100% (18/18), किया। लेखन वस्तुएं: 100% (21/21), 7.41 KiB, किया। कुल 21 (डेल्टा 9), पुन: उपयोग किया गया 0 (डेल्टा 0) रिमोट: आपको इतिहास को खोने से रोकने के लिए, गैर-फास्ट-फ़ॉरवर्ड अपडेट को अस्वीकार कर दिया गया था। दोबारा धकेलने से पहले दूरस्थ परिवर्तनों (जैसे 'गिट पुल') को मिलाएं। विवरण के लिए 'पुश पुश-help' के 'फास्ट-फॉरवर्ड के बारे में नोट' अनुभाग देखें।
श्रीकांत

4
@ श्रीकांत यह पूरी तरह से अक्षम करने के लिए संभव है कि receive.denyNonFastForwardsकॉन्फ़िगर विकल्प के साथ धक्का हो । यह विकल्प साझा किए गए रिपॉजिटरी पर डिफ़ॉल्ट रूप से सक्षम है। उस स्थिति में, यदि आप वास्तव में, वास्तव में एक जोर लगाना चाहते हैं, तो सबसे अच्छा विकल्प शाखा को हटाना और इसे फिर से बनाना है git push origin :remote_A; git push origin local_A:remote_A। लेकिन मैंने जो ऊपर लिखा उसके बारे में पढ़ें कि एक साझा भंडार पर इस तरह के वर्कफ़्लो को करने के लिए एक बुरा विचार क्यों है। आपको केवल ऐसा करने की कोशिश करनी चाहिए यदि आपके पास कुछ ऐसा है जो उस समस्या में गंभीर समस्या का कारण बनता है जिसे आप निकालने या फिर से लिखने की कोशिश कर रहे हैं।
ब्रायन कैंपबेल

14

आपको ऐसा करना पड़ सकता है git pull, जो आपके लिए MAY ऑटो मर्ज कर दे। तब आप फिर से कमिट कर सकते हैं। यदि आपके पास संघर्ष है, तो यह आपको उन्हें हल करने के लिए प्रेरित करेगा।

ध्यान रखें, आपको यह निर्दिष्ट करना होगा कि यदि आपने अपनी gitconfig को निर्दिष्ट करने के लिए अद्यतन नहीं किया है तो किस शाखा से खींचना है ...

उदाहरण के लिए:

git pull origin develop:develop

फिर भी गैर-फास्ट-फॉरवर्ड के बारे में पागल। इसे विलय के लिए मजबूर करने के बारे में कोई विचार? ! [rejected] develop -> develop (non-fast-forward)
rynmrtn

मुझे लगता है कि स्विच चालू है, लेकिन मैं गलत हो सकता है। kernel.org/pub/software/scm/git/docs/git-pull.html
टोनी

यह आंशिक रूप से काम करता है। मैं git push origin develop
गितुब

7

मैं ईजीट का उपयोग कर रहा था और मैंने इस मुद्दे का भी सामना किया। बस rebaseवर्तमान शाखा की कोशिश की और यह काम किया।

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