Git rebase - ยังคงบ่นต่อไปแม้ว่าข้อขัดแย้งในการผสานทั้งหมดจะได้รับการแก้ไขแล้วก็ตาม


115

ฉันกำลังประสบปัญหาที่ไม่แน่ใจว่าจะแก้ไขอย่างไร

ฉันทำการต่อต้านอาจารย์จากสาขาของฉัน:

git rebase master

และได้รับข้อผิดพลาดต่อไปนี้

 First, rewinding head to replay your work on top of it...
 Applying: checkstyled.
 Using index info to reconstruct a base tree...
 Falling back to patching base and 3-way merge...
 Auto-merging AssetsLoader.java
 CONFLICT (content): Merge conflict in AssetsLoader.java
 Failed to merge in the changes.
 Patch failed at 0001 checkstyled.

ดังนั้นฉันจึงไปที่ตัวแก้ไขที่ฉันชอบแก้ไขข้อขัดแย้ง 1 บรรทัดบันทึกไฟล์และทำสถานะคอมไพล์และได้ผลลัพธ์ต่อไปนี้:

 # Not currently on any branch.
 # Changes to be committed:
 #   (use "git reset HEAD <file>..." to unstage)
 #
 #  modified:   PassengerContactHandler.java
 #
 # Unmerged paths:
 #   (use "git reset HEAD <file>..." to unstage)
 #   (use "git add/rm <file>..." as appropriate to mark resolution)
 #
 #  both modified:      AssetsLoader.java
 #

ฉันทำคอมไพล์เพิ่ม AssetsLoader.java และสถานะ git และได้รับสิ่งต่อไปนี้:

 # Not currently on any branch.
 # Changes to be committed:
 #   (use "git reset HEAD <file>..." to unstage)
 #
 #  modified:   AssetsLoader.java
 #  modified:   PassengerContactHandler.java
 #

และเมื่อฉันทำ git rebase - ดำเนินการต่อฉันจะได้รับ:

git rebase --continue
You must edit all merge conflicts and then
mark them as resolved using git add

ฉันรู้ว่าฉันสามารถข้ามแพตช์และทำการรีเบสต่อได้ แต่ฉันไม่แน่ใจว่าการเปลี่ยนแปลงใน PassengerContactHandler.java จะถูกเปลี่ยนฐานในสาขาของฉันหรือไม่

ดังนั้นฉันไม่แน่ใจว่าควรดำเนินการอย่างไร

แก้ไข: เป็นไปได้ไหมว่าไฟล์ที่มีข้อขัดแย้งที่แก้ไขแล้วนั้นเหมือนกับเวอร์ชันดั้งเดิมทุกประการ

ขอบคุณมากลูคัส

แก้ไขมันเพิ่งเกิดขึ้นกับฉันอีกครั้ง:

มันเพิ่งเกิดขึ้นกับฉันอีกครั้ง

(307ac0d...)|REBASE)$ git status
# Not currently on any branch.
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   assets/world/level1/Level-1.xml
#   modified:   George.java
#   modified:   DefaultPassenger.java
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   mb-art/originalAssets/27dec/

((307ac0d ... ) | REBASE) $ git rebase - ดำเนินการต่อ

You must edit all merge conflicts and then
mark them as resolved using git add

คอมไพล์ - เวอร์ชัน

git version 1.7.1

นั่นคือผลลัพธ์ทั้งหมดgit statusใช่มั้ย? ไม่มีส่วนที่ขาดหายไปด้านล่าง?
Cascabel

git-rebaseไม่ควรรายงานว่ามีความขัดแย้งที่ยังไม่ได้รับการแก้ไขหากไม่มี หากคุณสามารถจัดการเพื่อทำให้ปัญหาเกิดขึ้นอีกครั้งในกรณีทดสอบที่ง่ายขึ้นการดีบักจะง่ายกว่ามาก แต่ถึงกระนั้นหากคุณgit statusรายงานว่าไม่มีข้อขัดแย้งเมื่อgit rebase --continueใดและ Git เวอร์ชันของคุณเป็นเวอร์ชันปัจจุบันคุณอาจลองส่งอีเมลถึง Git dev รายชื่ออีเมลที่ git@vger.kernel.org พร้อมข้อมูลการวินิจฉัยมากที่สุดเท่าที่จะทำได้
Cascabel

1
มันเพิ่งเกิดขึ้นกับฉันอีกครั้ง (307ac0d ... ) | REBASE) $ git status # ตอนนี้ยังไม่อยู่ในสาขาใด ๆ # การเปลี่ยนแปลงที่จะมุ่งมั่น: # (ใช้ "git reset HEAD <file> ... " เพื่อ unstage) # # modified: assets / world / level1 / Level-1.xml # modified: George.java # modified: DefaultPassenger.java # # ไฟล์ที่ไม่ได้ติดตาม: # (ใช้ "git add <file> ... " เพื่อรวมไว้ในสิ่งที่จะผูกมัด) # # mb-art / originalAssets / 27dec /
Lucas

ฉันคิดว่าคุณควรใช้ GITKRAKEN มันจะช่วยคุณในการแก้ไขความขัดแย้งของคุณ
Nikhil Bhardwaj

คำตอบ:


115

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

รายละเอียดเพิ่มเติมเล็กน้อย:

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

git add your/conflicted/file
git status

คุณจะได้เส้น (ปกติเป็นสีเขียว) แสดงไฟล์ที่แก้ไข

แก้ไข: ของคุณ / ขัดแย้ง / ไฟล์

git rebase - ดำเนินการต่อจะทำงานได้ดีในสถานการณ์นี้

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

git rebase --continue

git จะบ่นด้วย

ไม่มีการเปลี่ยนแปลง - คุณลืมใช้ 'git add' หรือไม่?

สิ่งที่ git ต้องการให้คุณทำในสถานการณ์นี้คือการใช้

git rebase --skip

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

แก้ไข: ของคุณ / ขัดแย้ง / ไฟล์

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

git rebase --skip

ดำเนินการต่อไป.

โพสต์ต้นฉบับกล่าวว่าบางครั้งใช้งานได้:

git add -A
git rebase --continue
# works magically?

... แต่อย่าพึ่งพาสิ่งนี้ (และอย่าลืมเพิ่มไฟล์ที่เหลือในโฟลเดอร์ที่เก็บของคุณ)


1
ดูเหมือนว่าฉันจะมีปัญหาเดียวกันและวิธีแก้ปัญหาเดียวกันดูเหมือนวิเศษ!
bspink

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

อย่าทำเช่นนี้เว้นแต่คุณต้องการติดตามไฟล์ขยะทั้งหมดไปยัง repo ของคุณ
Jed Lynch

git add ...น่ารำคาญมากที่จะพิมพ์หลังจากเปลี่ยนกองไฟล์ที่มีเส้นทางยาว มีgit add --all-the-files-i-changedฉันสามารถเรียกใช้ก่อนgit rebase continue?
jozxyqk

3
เพื่อให้ระมัดระวังในการใช้คำสั่ง git rebase --skip คุณอาจสูญเสียงานของคุณ (ไฟล์ที่แก้ไข)
Youness Marhrani

22

ดูเหมือนจะเป็นบั๊กใน Git 1.7

ต่อไปนี้เป็นบทความที่ดีเกี่ยวกับวิธีการแก้ปัญหานี้

โดยทั่วไปควรใช้งานได้ถ้าคุณทำไฟล์

git diff

หลังจากแก้ไขความขัดแย้งของคุณแล้ว

git rebase --continue

ควรทำงาน.


8

ฉันได้รับคำเตือนนี้เมื่อฉันมีไฟล์ที่ไม่ได้จัดเตรียมไว้ ตรวจสอบให้แน่ใจว่าคุณไม่มีไฟล์ที่ไม่ได้จัดเตรียมไว้ หากคุณไม่ต้องการให้ไฟล์ที่ไม่มีการจัดเตรียมการเปลี่ยนแปลงให้ยกเลิกการเปลี่ยนแปลงด้วยไฟล์

git rm <filename>  

2
ง่ายมากที่จะแสดงความคิดเห็น มีประโยชน์มากจึงควรเป็นคำตอบ ขอบคุณ!
Lucas Lima

4

ลองเรียกใช้สิ่งนี้ในบรรทัดคำสั่งของคุณ:

$ git mergetool

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


แค่คิดว่ามันอาจจะง่ายกว่าและยังช่วยให้คุณหลีกเลี่ยงสถานการณ์เช่นนี้ได้ในอนาคต
Batkins

1
คุณบันทึกตอนเย็นของฉัน แม้ว่ามันจะเป็นเครื่องมือง่ายๆ แต่ฉันก็ไม่สามารถหาวิธีแก้ปัญหาความขัดแย้งได้หากไม่มีเครื่องมือนี้
eonil

4

หลังจากแก้ไขข้อขัดแย้งแล้วตรวจสอบให้แน่ใจว่าได้เพิ่มไฟล์ที่เปลี่ยนแปลงไปยังไฟล์ที่จัดขั้นของคุณ สิ่งนี้ช่วยแก้ปัญหาให้ฉันได้


นี้ได้เคล็ดลับสำหรับฉัน. ฉันตรวจสอบ Sourcetree หลังจากได้รับข้อความที่อธิบายไว้ใน OP และทันทีที่เห็นทั้งสองไฟล์ที่กล่าวถึงในหน้าต่างคำสั่งที่นั่นว่าไม่มีการจัดเตรียม จัดลำดับไฟล์เรียกใช้ "git rebase --continue" และฉันก็กลับมาทำงานต่อ
Mass Dot Net

3

คุณพลาดข้อขัดแย้งในการรวมใน AssetsLoader.java เปิดขึ้นและมองหาเครื่องหมายความขัดแย้ง (">>>>", "====", "<<<<<") จากนั้นเพิ่มคอมไพล์อีกครั้ง ทำ 'git diff --staged' หากคุณมีปัญหาในการค้นหา


3
ฉันทำการ grep กับไฟล์ที่ติดตามทั้งหมดและไม่มีเครื่องหมายแสดงข้อขัดแย้ง
Lucas

ไม่git diff --stagedเปิดเผยอะไรมีประโยชน์หรือไม่ สิ่งนี้บ่งบอกถึงการเปลี่ยนแปลงที่คุณกำลังจะกระทำเพื่อแก้ไขข้อขัดแย้งในการผสาน ณ จุดนี้ใน rebase ควรมีบิต "โอ๊ะนั่นไม่ใช่สิ่งที่ฉันตั้งใจจะทำเพื่อแก้ไขปัญหานี้" ในไฟล์ใดไฟล์หนึ่ง
Ether

4
Git ไม่มองหาการผสานเครื่องหมายความขัดแย้งเมื่อคุณพยายามดำเนินการต่อ เพียงแค่ตรวจสอบเพื่อดูว่าดัชนีอยู่ในสถานะที่สะอาด หากคุณจัดเตรียมไฟล์ที่ยังคงมีเครื่องหมายความขัดแย้งอยู่แสดงว่าคุณต้องการที่จะยอมรับไฟล์นั้นในไฟล์นั้น อาจเป็นความผิดพลาดเสมอ แต่จะปล่อยให้คุณทำ
Cascabel

@ อื่น ๆ นี่ไม่ใช่เหตุผลเลย คุณสามารถgit addสร้างไฟล์ได้แม้จะมีเครื่องหมายความขัดแย้งอยู่ก็ตาม ท้ายที่สุดไฟล์ดังกล่าวอาจถูกกฎหมายอย่างสมบูรณ์!
fge

@Jefromi: ฮ่าน่ารู้! ฉันมักจะคิดเสมอว่ามีการตรวจสอบเครื่องหมายและใครจะต้อง - บังคับให้ผ่านมันหากเป็นเจตนา
Ether

3

ฉันเพิ่งมีปัญหานี้และในขณะที่ฉันคิดว่าอาจมีสาเหตุบางประการนี่คือของฉัน ...

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

ปัญหาดูเหมือนว่าเมื่อทำการรีเบสใหม่ - ดำเนินการต่อจะเรียกฮุคด้วย (เพื่อที่จะยอมรับการแข่งขันครั้งสุดท้ายของการเปลี่ยนแปลง) แต่ rebase จะไม่แสดงเอาต์พุตของ hook แต่จะเห็นว่าล้มเหลวจากนั้นพ่นข้อผิดพลาดที่เฉพาะเจาะจงน้อยลงโดยระบุว่า 'คุณต้องแก้ไขข้อขัดแย้งในการผสานทั้งหมดแล้วทำเครื่องหมายว่าแก้ไขแล้วโดยใช้ git add'

ในการแก้ไขให้จัดขั้นตอนการเปลี่ยนแปลงทั้งหมดของคุณและแทนที่จะทำ 'git rebase --continue' ให้ลองใช้ 'คอมมิต' หากคุณกำลังประสบปัญหาเกี่ยวกับเบ็ดเดียวกันคุณควรดูสาเหตุที่ทำให้มันล้มเหลว

ที่น่าสนใจคือในขณะที่ git rebase ไม่แสดงผลลัพธ์จาก git hook แต่ก็ยอมรับ - ไม่ตรวจสอบเพื่อข้าม hooks


1
ฉันมีปัญหาที่คล้ายกัน ไม่มีอะไรอื่นที่ใช้ได้ผลสำหรับฉัน แต่การทำ 'คอมไพล์' แล้วการยกเลิกดูเหมือนจะแก้ไขความคลาดเคลื่อนได้อย่างน่าอัศจรรย์และจากนั้นฉันก็สามารถ 'git rebase - ดำเนินการต่อ' ได้สำเร็จ
patrickvacek

สำหรับบันทึกเนื่องจากเมื่อเร็ว ๆ นี้ฉันกำลังดิ้นรนกับปัญหาที่คล้ายกันให้git rebaseยอมรับ--no-verifyตัวเลือก แต่ก็ละเว้นเพียงpre-rebaseเบ็ด git commitแต่ตัวเลือกนี้ไม่นำไปใช้ในการโทรตามมาเพื่อ
pkrysiak

มีจุดที่ถูกต้อง (คอมมิตการเปลี่ยนแปลง) แต่ละเอียดเกินไปสำหรับคำตอบที่ดี
Jack Miller

2

เมื่อคุณแก้ไขการเปลี่ยนแปลงแล้วคุณอาจลืมเรียกใช้ 'git add -A'

git add -A
git rebase --continue

1

ฉันเพิ่งสะดุดกับปัญหา ฉันจะไม่git rebase --skip เพราะgit statusแสดงให้เห็นอย่างชัดเจนการปรับเปลี่ยน stagged ซึ่งผมอยากให้ แม้ว่าฉันจะมีไฟล์พิเศษบางอย่างที่มาโดยไม่คาดคิด ฉันแก้ไขด้วย

git checkout .

เพื่อลบการปรับเปลี่ยนที่ไม่ติดป้ายก็git rebase --continueทำได้สำเร็จ

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