Git rebase merge ขัดแย้งไม่สามารถดำเนินการต่อได้


131

ฉันพยายาม rebase 'dev' เพื่อให้ทันกับสาขา 'master'

$ git checkout dev 
$ git rebase master 
First, rewinding head to replay your work on top of it...
Applying: Corrected compilation problems that came from conversion from SVN.
Using index info to reconstruct a base tree...
M       src/com/....
<stdin>:125: trailing whitespace.
/**
<stdin>:126: trailing whitespace.
 *
<stdin>:127: trailing whitespace.
 */
<stdin>:128: trailing whitespace.
package com....
<stdin>:129: trailing whitespace.

warning: squelched 117 whitespace errors
warning: 122 lines add whitespace errors.
Falling back to patching base and 3-way merge...
Auto-merging src/com/....
CONFLICT (content): Merge conflict in src/com/...
Failed to merge in the changes.
Patch failed at 0001 Corrected compilation problems that came from conversion from SVN.

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

$ vi src/com/.....   { fixed the merge issue on one file } 
$ git add -A . 
$ git rebase --continue 
src/com/....: needs merge
You must edit all merge conflicts and then
mark them as resolved using git add
$ vi src/com....      { verified, no >>> or <<< left, no merge markers } 
$ git rebase --continue 
Applying: Corrected compilation problems that came from conversion from SVN.
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 check out the original branch and stop rebasing run "git rebase --abort".

ความคิดใด ๆ


หมายเหตุ: มีหลายกรณีที่ a git rebase --skipยังทำงานไม่ถูกต้อง จนถึง Git 2.0.2 (กรกฎาคม 2014) ดูคำตอบของฉันด้านล่าง
VonC

คำตอบ:


223

มีบางสถานการณ์ที่ฉันเห็นว่าrebaseติดอยู่ หนึ่งคือหากมีการเปลี่ยนแปลงกลายเป็นโมฆะ (กระทำมีการเปลี่ยนแปลงที่ทำไปแล้วก่อนหน้านี้ใน rebase) git rebase --skipที่ซึ่งในกรณีนี้คุณอาจจะต้องใช้

มันง่ายที่จะบอก ถ้าคุณทำgit statusมันไม่ควรแสดงการเปลี่ยนแปลง ถ้าเป็นเช่นนั้นข้ามมันไป หากไม่ใช่กรณีนี้โปรดโพสต์สำเนาไว้git statusและฉันสามารถช่วยเหลือเพิ่มเติมได้


ไม่ว่าเป็นอย่างนั้นมีการเปลี่ยนแปลง "ไม่" เนื่องจาก ฉันข้ามมันและเปรียบเทียบไฟล์หลังจากนั้นมันเป็นสิ่งที่ควรจะเป็น
awm

สิ่งนี้ช่วยฉันเมื่อ 'git pull --rebase master master "ของฉันดูเหมือนจะติดอยู่ในระหว่างการแก้ปัญหาความขัดแย้งและข้ามหลังจากความอดทนเพิ่มขึ้นเล็กน้อยฉันได้รับการแก้ไขแล้ว!
AnneTheAgile

3
ผลตอบแทนสถานะ git: "กำลังดำเนินการ rebase; ไปยัง <commitnumber> ขณะนี้คุณกำลังทำการรีบูตสาขา '<branchname>' ใน '<commitnumber>' (ความขัดแย้งทั้งหมดคงที่: เรียกใช้" git rebase - ต่อเนื่อง ")" git rebase - ไม่ส่งคืนการเปลี่ยนแปลงใด ๆ ในขณะที่ git rebase --skip ทำ แต่ในกรณีของฉันฉันได้รับสถานการณ์นั้นซ้ำแล้วซ้ำอีก ถูกต้องหรือว่ามีบางอย่างผิดปกติ?
adi

ขอบคุณ ฉันเป็นห่วงว่า--skipจะแย่ไปกว่าการทำสิ่งที่เปลี่ยนแปลงไป
jchook

ในกรณีของฉันทั้ง Intellij Idea GUI และ SourceTree แสดงให้เห็นว่าแต่ละไฟล์ถูกเพิ่มเข้ามาในคอมมิชชันในขณะที่git statusแสดงว่ามีไฟล์ที่ถูกแก้ไข แต่ไม่ได้เพิ่มเข้ามาในคอมมิชชัน add somefile.txtอนุญาตให้ทำการแสดงเพื่อดำเนินการต่อกับการรีบูต
azizbekian

16

ครั้งหนึ่งที่ฉันได้วิ่งเข้าไปในปัญหานี้คือเมื่อทำหลังจากที่git commit git addดังนั้นลำดับต่อไปนี้จะทำให้เกิดข้อผิดพลาด rebase ที่คุณพูดถึง:

git add <file with conflict>
git commit -m "<some message>"
git rebase --continue

ในขณะที่ลำดับด้านล่างจะทำงานโดยไม่มีข้อผิดพลาดและดำเนินการรีบูตต่อ:
git add <file with conflict>
git rebase --continue

อาจเป็นไปได้ว่าgit add -Aเมื่อใช้ตัวเลือก "ทั้งหมด" กำลังสร้างสถานการณ์ที่คล้ายกัน (โปรดทราบว่าฉันไม่มีประสบการณ์ในเรื่องคอมไพล์ดังนั้นคำตอบนี้อาจไม่ถูกต้อง) เพื่อความปลอดภัยgit rebase --skipดูเหมือนว่าจะทำงานได้ดีในสถานการณ์เช่นนี้


6

หมายเหตุ: Git 2.0.2 (กรกฎาคม 2014) ได้มีการแก้ไขกรณีหนึ่งที่git rebase --skipจะติดและจะไม่สามารถดำเนินการต่อกับ rebase ปัจจุบัน
ดูคอมมิท 95104c7โดยbrian m คาร์ลสัน ( bk2204)

rebase--merge: แก้ไข--skipโดยมีข้อขัดแย้งสองข้อติดต่อกัน

หากgit rebase --mergeพบข้อขัดแย้ง--skipจะไม่ทำงานหากการกระทำครั้งต่อไปขัดแย้งกัน ไฟล์จะไม่ได้รับการปรับปรุงจำนวนแพทช์ใหม่จึงไม่มีแพทช์จะจริงจะข้ามส่งผลในวงหลีกเลี่ยงไม่ได้
msgnum

อัปเดตmsgnumค่าของไฟล์เป็นสิ่งแรกใน call_merge
นี่จะเป็นการหลีกเลี่ยงAlready appliedข้อความ "" เมื่อข้ามการส่งข้อความ
ไม่มีการเปลี่ยนแปลงที่มองเห็นได้สำหรับบริบทอื่น ๆ ที่ call_merge ถูกเรียกใช้เนื่องจากค่าของไฟล์ msgnum ยังคงไม่เปลี่ยนแปลงในสถานการณ์เหล่านั้น


3
$ vi src/com....      { verified, no >>> or <<< left, no merge markers } 
$ git rebase --continue 

ดูเหมือนว่าคุณจะลืมการgit addเปลี่ยนแปลง ...


มันเป็นเพียง "ยืนยัน" ไม่จำเป็นต้องมีการเปลี่ยนแปลงในครั้งที่ 2 ... เพิ่มคอมไพล์อยู่ด้านบน
awm

ใช่คุณใช้git addแล้วผสานต่อและหยุดเพราะไฟล์อื่นมีข้อขัดแย้งดังนั้นคุณต้องแก้ไขไฟล์นั้นด้วย ฉันทำอะไรบางอย่างหายไปหรือเปล่า
John Brodie

1
เป็นไฟล์เดียวกับที่ต้องรายงานการผสาน ตกลงสำหรับคุณฉันจะทำอีก "git add" แต่มันเป็นผลลัพธ์เดียวกัน
awm

ขอบคุณ! นั่นคือสถานการณ์ของฉัน: ฉันแก้ไขข้อขัดแย้ง แต่ไม่แสดงการเปลี่ยนแปลง
คิริลล์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.