Git rebase: संघर्ष प्रगति को रोकते हैं


120

मेरे पास एक git शाखा है (जिसे v4 कहा जाता है), जिसे कल ही मास्टर से बनाया गया था। मास्टर में कुछ बदलाव थे, जो मैं v4 में लाना चाहता हूं। इसलिए, v4 में, मैंने मास्टर से रिबेस करने की कोशिश की, और एक फ़ाइल चीजों को खराब करती रहती है: एक-लाइन टेक्स्ट फ़ाइल, जिसमें संस्करण संख्या होती है। यह फ़ाइल है app/views/common/version.txt, जिसमें रिबासिंग से पहले यह पाठ शामिल है:

v1.4-alpha-02

यहाँ मैं क्या कर रहा हूँ:

> git rebase master
First, rewinding head to replay your work on top of it...
Applying: new version, new branch
error: patch failed: app/views/common/version.txt:1
error: app/views/common/version.txt: patch does not apply
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging app/views/common/version.txt
CONFLICT (content): Merge conflict in app/views/common/version.txt
Failed to merge in the changes.
Patch failed at 0001 new version, new branch

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".

version.txtअब इस तरह दिखता है:

<<<<<<< HEAD:app/views/common/version.txt
v1.4-alpha-02
=======
v1.4-alpha-01
>>>>>>> new version, new branch:app/views/common/version.txt

तो, मैं इसे साफ करता हूं और यह अब इस तरह दिखता है:

v1.4-alpha-02

और फिर मैंने ले जाने की कोशिश की: पहले तो मैंने एक कोशिश की:

> git commit -a -m "merged"
# Not currently on any branch.
nothing to commit (working directory clean)

वहां कोई किस्मत नहीं। इसलिए, मैं फ़ाइल जोड़ने का प्रयास कर रहा था:

git add app/views/common/version.txt

कोई जवाब नहीं। कोई खबर अच्छी खबर नहीं है, मुझे लगता है। इसलिए, मैं जारी रखने की कोशिश करता हूं:

> git rebase --continue
Applying: new version, new branch
No changes - did you forget to use 'git add'?

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".

यह इस बिंदु पर है, इस के साथ गोल-गोल घूमने के बाद, कि मैं डेस्क से अपना सिर पीट रहा हूं।

यहाँ क्या चल रहा है? मैं क्या गलत कर रहा हूं? क्या कोई मुझे सीधा खड़ा कर सकता है?

EDIT - अनटुब के लिए

मैंने आपके द्वारा सुझाई गई फ़ाइल को बदल दिया और वही त्रुटि प्राप्त की:

> git rebase master
First, rewinding head to replay your work on top of it...
Applying: new version, new branch
error: patch failed: app/views/common/version.txt:1
error: app/views/common/version.txt: patch does not apply
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging app/views/common/version.txt
CONFLICT (content): Merge conflict in app/views/common/version.txt
Failed to merge in the changes.
Patch failed at 0001 new version, new branch

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".

10
इस सवाल को पूछने के लिए धन्यवाद .. मैं ठीक उसी समस्या का सामना कर रहा था
अर्चना मिश्रा

6
अच्छा होगा यदि आप कुछ उत्तर की पुष्टि करते हैं
होम्स

3
@MaxWilliams, मुझे लगता है कि आप (मेरे जैसे) ने @unutbu की सलाह का गलत अर्थ लगाया है : 1) पहले आप दौड़ें git rebase master और इसे विफल होने दें ; 2) फिर आप version.txtइसे संपादित करते हैं और जैसा कि उस बिंदु को देखना चाहिए, और संपादित करें को बचाएं; 3) फिर आप git add .../version.txt; 4) तब आप git rebase --continue( 'कमिट नहीं ' ) करते हैं! यदि rebase --continueयहां सफल होता है, तो यह पहले से ही प्रतिबद्ध है (यहां कोई ज़रूरत नहीं git commitहै!) - इसलिए यह सब करना बाकी है git push(यदि आप रिमोट रेपो का उपयोग करते हैं)। आशा है कि यह मदद करता है, अगर मुझे यह सही मिला :)- चीयर्स!
सादाऊ

@MaxWilliams, क्या तुमने कभी इसके लिए एक जवाब मिला: ruby-forum.com/topic/187288 (मैं जवाब देने के तुरंत बाद इसे हटा दूंगा अगर कोई और पहले वहाँ नहीं मिलता है !!)
atw

जवाबों:


102

मुझे रिबास के साथ इसी तरह की समस्या का सामना करना पड़ा। मेरी समस्या इसलिए हुई क्योंकि मेरी एक कमिट ने केवल एक फ़ाइल बदल दी, और हल करते समय, मैंने इस कमिट में पेश किए गए बदलाव को छोड़ दिया। मैं संबंधित समस्या ( git rebase --skip) को छोड़ कर अपनी समस्या को हल करने में सक्षम था ।

आप इस समस्या का परीक्षण रिपॉजिटरी में कर सकते हैं। सबसे पहले भंडार बनाएँ।

$ mkdir failing-merge
$ cd failing-merge
$ git init
Initialized empty Git repository in $HOME/failing-merge/.git/

फिर version.txtमास्टर की मूल सामग्री को प्रतिबद्ध करें ।

$ echo v1.4-alpha-02 > version.txt
$ git add version.txt
$ git commit -m initial
[master (root-commit) 2eef0a5] initial
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 version.txt

v4शाखा बनाएँ और की सामग्री बदलें version.txt

$ git checkout -b v4
Switched to a new branch 'v4'
$ echo v1.4-alpha-03 > version.txt
$ git add version.txt
$ git commit -m v4
[v4 1ef8c9b] v4
 1 files changed, 1 insertions(+), 1 deletions(-)

वापस जाएं masterऔर सामग्री को बदल दें version.txtताकि रिबास के दौरान एक उलझन हो।

$ git checkout master
Switched to branch 'master'
$ echo v1.4-alpha-04 > version.txt
$ git add version.txt
$ git commit -m master
[master 7313eb3] master
 1 files changed, 1 insertions(+), 1 deletions(-)

v4ब्रांच में वापस जाएं और रिबेस करने की कोशिश करें। यह version.txtयोजना के अनुसार एक उलझन के साथ विफल रहता है ।

$ git checkout v4
Switched to branch 'v4'
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: v4
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging version.txt
CONFLICT (content): Merge conflict in version.txt
Recorded preimage for 'version.txt'
Failed to merge in the changes.
Patch failed at 0001 v4

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".
$ cat version.txt
<<<<<<< HEAD
v1.4-alpha-04
=======
v1.4-alpha-03
>>>>>>> v4

हम masterसामग्री का चयन करके संघर्ष को हल करते हैं version.txt। हम फ़ाइल को जोड़ते हैं और हमारे रिबेस को जारी रखने की कोशिश करते हैं।

$ echo v1.4-alpha-04 > version.txt
$ git add version.txt
$ git rebase --continue 
Applying: v4
No changes - did you forget to use 'git add'?
If there is nothing left to stage, chances are that something else
already introduced the same changes; you might want to skip this patch.

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".

यह विफल रहा ! आइए देखें कि gitहमारे भंडार में क्या बदलाव हैं ।

$ git status
# Not currently on any branch.
nothing to commit (working directory clean)

आह आह, कोई बदलाव नहीं है। यदि आपने पिछले त्रुटि संदेश को विस्तार से पढ़ा है, तो gitहमें इसकी जानकारी दी और उपयोग करने की सिफारिश की git rebase --skip। उन्होंने हमसे कहा "यदि मंच पर कुछ नहीं बचा है, तो संभावना है कि कुछ और पहले से ही समान बदलाव पेश किए हैं; आप इस पैच को छोड़ना चाह सकते हैं।" इसलिए हम सिर्फ कमिटमेंट को छोड़ देते हैं और रिबास सफल होता है।

$ git rebase --skip
HEAD is now at 7313eb3 master

सतर्कता का वचन : कृपया ध्यान दें कि git rebase --skipउस कमिट को पूरी तरह से छोड़ देंगे, जिसने gitरिबेस करने की कोशिश की थी। हमारे मामले में, यह ठीक होना चाहिए क्योंकि gitशिकायत है कि यह एक खाली प्रतिबद्धता है। यदि आपको लगता है कि रिबास पूरा होने के बाद आपने बदलाव खो दिए हैं, तो आप git reflogरिबास से पहले अपनी रिपॉजिटरी की प्रतिबद्ध आईडी प्राप्त करने के लिए उपयोग कर सकते हैं , और git reset --hardअपने डिपो को वापस उसी स्थिति में लाने के लिए उपयोग कर सकते हैं (यह एक और विनाशकारी ऑपरेशन है)।


4
उस लंबी व्याख्या सिल्वेन को लिखने के लिए समय निकालने के लिए धन्यवाद! यह स्पष्ट करता है। मुझे लगता है कि मैं हमेशा एक पैच को स्किप करने से हमेशा घबराता था क्योंकि ऐसा लगता था जैसे काम खो सकता है: यानी कि पैच में रिबास से प्रभावित सभी फाइलें शामिल थीं, बजाय केवल संघर्ष के साथ। क्या पैच एक सिंगल फाइल पर सिर्फ एक मर्ज है?
मैक्स विलियम्स

3
नहीं, एक पैच में एक ही प्रतिबद्ध में संशोधित सभी फाइलों पर सभी अंतर हैं। लेकिन उपयोग करते समय git rebase --skip, आप केवल एक ही प्रतिबद्ध छोड़ते हैं। मैं आमतौर पर git statusयह देखने के लिए प्रतिबद्ध हूं कि क्या मैं इस स्थिति में हूं या नहीं।
सिल्वेन डेफ्रेसने

1
मैं सिर्फ एक महान स्पष्टीकरण लिखने के लिए समय निकालने के लिए धन्यवाद कहने में मैक्स को प्रतिध्वनित करना चाहता था - मैं अंत में समझता हूं कि ऐसा क्यों हो रहा है। मैं भी अब नहीं डरता rebase --skip:)।
बेन डोलमैन

1
चेतावनी - यदि आपके पास एक प्रतिबद्ध में कई बदलाव हैं, तो आप गिट रिबेस --स्किप कर काम खो सकते हैं। मैं बस किया था
क्रिसी एच

@ क्रिसिल जब तक आपने किया git reflog purgeया git reflog deleteआप अभी भी उपयोग करके अपने परिवर्तन वापस पा सकते हैं git reflog। उन विभिन्न प्रतिबद्धों की जांच करने की कोशिश करें जो वहां संदर्भित हैं, उनमें से एक आपके पूरे होने से पहले आपके पेड़ की स्थिति होनी चाहिए git rebase
सिल्वेन डेफ्रेसन

23

यहाँ से उद्धृत: http://wholemeal.co.nz/node/9

हुह?!? नहीं, मैं git add का उपयोग करना नहीं भूलता, मैंने इसे किया ... जैसे ... 2 सेकंड पहले!

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

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

$ git rebase --skip

जब मैंने git mergetool का उपयोग किया और परिवर्तनों को ठीक किया, तब उन्हें जोड़ा और उन्हें प्रतिबद्ध किया, मैंने बस <code> git rebase --skip </ code> दर्ज किया, जबकि 'वर्तमान में किसी भी शाखा में नहीं।' और सब कुछ तय हो गया था। धन्यवाद!
geerlingguy

वास्तव में, मुझे लगता है कि यह लगातार चलने वाले मेरिट मेरिटूल का संयोजन था, फिर गिट रिबास - कॉन्टिन्यू, फिर गिट मेरिजेट, आदि जिसने अंततः मेरी स्थिति तय की।
जेरलिंग्गुई

6

वह त्रुटि संदेश आपके लिए एक परिणाम है git commit -a -m "merged"। यदि आप फ़ाइल को ठीक करते हैं, तो चलाएं git add <file>, और git rebase --continue, इसे ठीक काम करना चाहिए। git rebase --continueएक कमिट करने की कोशिश कर रहा है, लेकिन यह पता लगाना कि कमिट करने के लिए कोई पेंडिंग बदलाव नहीं हैं (क्योंकि आपने उन्हें पहले ही कमिट कर दिया है)।


1
यह कम से कम सामान्य मामले में, स्किप करने की तुलना में अधिक उचित है। मुझे आश्चर्य है कि यह सर्वश्रेष्ठ उत्तर के रूप में सूचीबद्ध नहीं है।
पन्ना।

1
@EmeraldD।, काम नहीं करता है। फ़ाइल को ठीक करने और चलाने git add <file>से समस्या हल नहीं होगी। git rebase --continue अभी भी रिपोर्ट करता हैNo changes - did you forget to use 'git add'?
पचेरियर

6

एप्लिकेशन / दृश्य / आम / version.txt को बदलें

v1.4-alpha-01

इस बिंदु पर छूट में, याद रखें कि आप गैर-मास्टर शाखा की प्रगति दिखाने के लिए मर्ज संघर्षों को हल कर रहे हैं ।

तो, से रिबासिंग में

      A---B---C topic
     /
D---E---F---G master

सेवा

              A*--B*--C* topic
             /
D---E---F---G master

आप जिस संघर्ष को हल कर रहे हैं वह विषय शाखा पर A * कैसे बनाया जाए।

इसलिए करने के बाद git rebase --abort, कमांड होना चाहिए

git checkout topic
git rebase master
< make edits to resolve conflicts >
git add .
git rebase --continue

3
धन्यवाद unutbu, मैंने कोशिश की है कि नहीं, लेकिन भाग्य: नए संपादन के लिए OP देखें। चीयर्स
मैक्स विलियम्स

4

आपके द्वारा देखा जा रहा व्यवहार वह नहीं है जो मैं इस संघर्ष के साथ एक ठेठ छूट से उम्मीद करूंगा। इस छूट को करने के लिए एक अलग शाखा का उपयोग करने पर विचार करें (खासकर यदि आपने पहले से ही कमिट को धक्का दे दिया है जो आप तेजी से अग्रेषित कर रहे हैं)। इसके अलावा, git mergetoolसंघर्षों को हल करने और जारी करने के लिए याद रखने के लिए मददगार हो सकता है git add

इस न्यूनतम उदाहरण में, रिबास अपेक्षित रूप से काम करता है। क्या आप एक उदाहरण प्रदान कर सकते हैं जो आपके द्वारा देखे जा रहे व्यवहार को दर्शाता है?

#!/bin/bash

cd /tmp
mkdir rebasetest
cd rebasetest
git init
echo 'v1.0' > version.txt
git add version.txt
git commit -m 'initial commit'
git checkout -b v4
echo 'v1.4-alpha-01' > version.txt
git add version.txt
git commit -m 'created v4'
git checkout master
git merge v4
echo 'v1.4-alpha-01-rc1' > version.txt
git add version.txt
git commit -m 'upped version on master to v1.4-alpha-01-rc1'
git checkout v4
echo 'v1.4-alpha-02' > version.txt
git add version.txt
git commit -m 'starting work on alpha-02'

git rebase master
echo 'v1.4-alpha-02' > version.txt
git add version.txt
git rebase --continue

4

यहाँ कुछ विचार हैं:

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