रीट के बाद गेट ब्रांच को डायवर्ट किया गया


112

मैंने स्थानीय रूप से एक शाखा को विद्रोह किया है जिसे पहले से ही धक्का दिया गया था।

Git सलाह दे रहा है कि मेरी शाखा और रिमोट का विचलन हो गया है और:

"और क्रमशः 109 और 73 अलग-अलग कमेंट हैं,"

क्या मेरी शाखा इसे आगे बढ़ाएगी - यानी एक छूट के बाद यह उम्मीद की जानी चाहिए?


मेरे साथ भी वही दिक्कत है। क्या हम कह सकते हैं कि "करने का सही तरीका" स्थानीय शाखा को फिर से स्थापित करना है और केवल धक्का देना है?
मेहर दीदारियन

जवाबों:


154

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

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

TL; DR - यदि आप सहयोग नहीं कर रहे हैं, तो पुश -f का उपयोग करके शाखा को धक्का दें। यदि आप हैं, तो शाखा को पिछली स्थिति में रीसेट करें, और इसके बजाय स्रोत शाखा में मर्ज करें।


1
"चूंकि आप पहले ही शाखा को धक्का दे चुके हैं, इसलिए आपको स्रोत शाखा में विलय करना चाहिए" - ऐसा क्यों है?
हम्मेट

1
@ HamiltonVerissimo जेसन का पहला वाक्य: "जब आप किसी शाखा को रिबेट करते हैं, तो आपको उस कमिट के लिए कमिट को फिर से लिखना होगा, जो उस ब्रांच के कमिट्स के ऊपर है, जिस पर आप रिबास कर रहे हैं।" भले ही "ऊपर" में किए गए परिवर्तनों में समान तार्किक सामग्री हो, फिर भी उन्हें अलग आधार पर लागू किया जा रहा है और इसलिए अलग-अलग हैश के साथ अलग-अलग तरीके हैं। यदि अन्य डेवलपर्स पूर्व-विद्रोही शाखा से काम कर रहे हैं तो git push -f करना उनके वर्कफ़्लो के लिए अत्यंत विघटनकारी होगा। इस प्रकार, चूंकि इस शाखा को एक सार्वजनिक स्रोत पर धकेल दिया गया है, जिसे उसे विलय करना चाहिए था।
जगा

4
यदि आप सुनिश्चित नहीं हैं कि यदि आप किसी और चीज को पहले से ही धक्का दे चुके हैं तो आप पुश -फोर्स-विद-लीज़ का उपयोग कर सकते हैं।
सांत्वना

1
@ jason-lebrun उल्टा बदलाव को मर्ज करने के लिए नकारात्मक नहीं है कि आप अपने खुद के काम को चेतावनी के बिना लिख ​​सकते हैं? क्या मर्जिंग संघर्षों का उसी तरह से पता लगाया जाता है जैसे कि रिबासिंग करते समय? उदाहरण के लिए, यदि मैं अपनी शाखा में किसी फ़ाइल से एक खंड निकालता हूं क्योंकि इसकी अब कोई आवश्यकता नहीं है, लेकिन किसी और व्यक्ति ने नदी के ऊपर एक ही खंड में एक तुच्छ परिवर्तन किया, जैसे कुछ व्हाट्सएप या कुछ वैश्विक खोज / कार्रवाई को प्रतिस्थापित करना, नहीं होगा। मेरी शाखा के शीर्ष पर विलय करना मेरे विलोपन को उनके तुच्छ परिवर्तन वाले संस्करण से बदल देता है?
क्रिस ब्लूम

1
क्या दूसरी शाखा को आप में विलय करना एक बुरा विचार नहीं है? उदाहरण के लिए एक विशेषता शाखा में मास्टर विलय - क्या इसके लिए एक नई प्रतिबद्धता नहीं बनाई जाएगी? यदि बाद में मास्टर में विलय हो जाता है तो क्या यह सुविधा शाखा एक बार अतिरिक्त प्रतिबद्ध नहीं होगी?
रॉस

55

आपके सभी कमिट ने आईडी बदल दिए हैं, इसलिए डायवर्सन वास्तव में एक विचलन नहीं है ।

अपनी समस्या को हल करने के लिए आपको अपनी दूरस्थ शाखा को अधिलेखित करना होगा:

git push -f origin experiment

http://git-scm.com/book/ch3-6.html

स्पष्टीकरण:

देखें कि इस छवि में C3 को रिबेस के बाद C3 के रूप में नहीं, बल्कि C3 के रूप में रखा गया है। ऐसा इसलिए है क्योंकि यह बिल्कुल C3 नहीं है, लेकिन इसके सभी कोड परिवर्तन हैं।

रिबेस

इस दूसरी छवि पर आपको चित्र मिलता है कि जब रिमोट शामिल होता है, तो रिबास कैसा दिखता है और डायवर्सन क्यों होता है।

डायवर्ज और गिट पुश

किसी भी मामले में, जब आप मजबूर धक्का करते हैं, तो यह आपको बताएगा कि यह एक (बल अद्यतन) किया था, आपको उस बिंदु पर ठीक होना चाहिए।

शीर्ष पर लिंक चेकआउट करें, और "गिट पुश --फोर्स" खोजें। आप अधिक विस्तृत विवरण देखेंगे।


3
हाँ। मुझे लगता है कि यह समस्या हल करती है। लेकिन, जब आप किसी टीम के साथ काम कर रहे होते हैं, जब आपका धक्का दूसरों के द्वारा हाल ही में किए गए किसी काम को ओवरराइट कर सकता है, तो फोर्स पुश काम नहीं कर सकता है। क्या मैं सही हू?
हरि कृष्ण गंजी २३'१४

इसका वांछित प्रभाव नहीं हो सकता है। रिबेस करने से पहले सुनिश्चित करें कि आप अपने परिवर्तनों को 'तेजी से आगे' मर्ज करें।
मैमोरियल

1

मुझे निम्नलिखित कार्य करके एक पुश के लिए रिबेस डायवर्ज के साथ सफलता मिली:

git checkout mybranch
git pull
git push origin mybranch

पुल ने डायवर्ज को हल कर दिया।

पुल से आगे

Your branch and 'origin/mybranch' have diverged,
and have 2 and 1 different commit(s) each, respectively.

पूर्ण उत्पादन

पुनरावर्ती द्वारा बनाया गया विलय। mypath / myfile.py | 12 +++++++++++ - 1 फाइलें बदली, 11 सम्मिलन (+), 1 विलोपन (-)

पुल के बाद

आपकी शाखा 3 आवागमन द्वारा 'मूल / माइब्रंच' से आगे है।

पुशर के बाद

mybranch शाखा से 3 आगे है फिर भी एक खुला पुल अनुरोध मर्ज संदेश है जो प्रतिबद्ध इतिहास में जोड़ा गया है

मैं यह मान रहा हूँ कि शायद बल धक्का यही करता है, और मैंने सत्यापित नहीं किया है।

जैसा कि दूसरों ने कहा है, अगर आप पहले से ही एक खुला पुल अनुरोध करते हैं, तो एक रिबेस से बचें। मैं इस उदाहरण को कुछ के रूप में प्रदान कर रहा हूं जो मेरे लिए काम करता है।


1

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

  1. मुख्य शाखा विकसित है
  2. आप एक नई शाखा सुविधा / do_stuff की जांच करते हैं
  3. एक टीम के सदस्य को विकसित करने के लिए एक नई प्रतिबद्ध धक्का

यदि आपने अपनी विकसित शाखा को अपडेट नहीं किया है तो "git checkout develop" && "git rebase feature / do_stuff" सही ढंग से काम करेगा क्योंकि आपके चेकआउट के बाद से कोई कमिट नहीं जोड़ा गया है। हालाँकि, यदि आपने नए कमिट को विकसित करने और बाहर निकालने की जाँच की है, तो आप इस विचलन को देखेंगे यदि आप एक नई प्रतिबद्धता के कारण रिजेक्ट करने की कोशिश करते हैं। बिना जोर लगाए एक आसान फिक्स (आमतौर पर टीम के माहौल में अच्छा विचार नहीं है):

  1. git चेकआउट सुविधा / do_stuff
  2. git रिबास का विकास
  3. गिट चेकआउट विकसित करना
  4. git रिबास सुविधा / do_stuff

चरण 2 से रिबास गुमशुदा कमिटमेंट को फीचर / do_stuff में लाता है, इसलिए जब चरण 4 आता है तो यह अद्यतित होता है और परिवर्तन के लिए एक नई कमिट बनाने की आवश्यकता नहीं होती है।

यह एक ऐसा समाधान है जो मुझे पता है कि काम करता है क्योंकि मैं बस इस में भाग गया था और ऊपर दिए गए कदमों ने जबरन विकसित करने के लिए सफलतापूर्वक धक्का दिया। मैं 50 से अधिक डेवलपर्स की टीम में काम करता हूं, इसलिए मुझे अपनी स्वयं की परीक्षण शाखाओं के अलावा किसी भी चीज़ को बल देने के लिए मना किया जाता है, इसलिए मुझे एक संकल्प ढूंढना पड़ा।

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