ฉันจะแก้ไขข้อขัดแย้งในการรวมเนื่องจากการลบไฟล์ในสาขาได้อย่างไร


208

ฉันได้สร้างdialogสาขาและเมื่อฉันพยายามที่จะรวมmasterสาขา มี 2 ​​ข้อขัดแย้ง CONFLICT (delete/modify)ผมไม่ทราบว่าจะแก้ปัญหาอย่างไร คุณช่วยบอกฉันทีว่าจะทำอย่างไร

$ git checkout master
$ git merge dialog
CONFLICT (delete/modify): res/layout/dialog_item.xml deleted in dialog and modified in HEAD. Version HEAD of res/layout/dialog_item.xml left in tree.
Auto-merging src/com/DialogAdapter.java
CONFLICT (content): Merge conflict in src/DialogAdapter.java
Automatic merge failed; fix conflicts and then commit the result.

ผมได้เปิดคงความขัดแย้งและไม่src/DialogAdapter.java git add src/DialogAdapter.javaฉันต้องทำอะไรอีก


คุณสามารถอ่านโพสต์นี้บน Stack Overflow: - ฉันจะแก้ไขข้อขัดแย้งใน Git ได้อย่างไร? คำตอบที่ได้รับการยอมรับอ้างอิงคู่มือการคอมไพล์
Heavyyd

คำตอบ:


271

ข้อความขัดแย้ง:

ความขัดแย้ง (ลบ / แก้ไข): res / layout / dialog_item.xml ลบในกล่องโต้ตอบและแก้ไขใน HEAD

หมายความว่า res/layout/dialog_item.xmlถูกลบในสาขา 'โต้ตอบ' ที่คุณกำลังผสาน แต่ถูกแก้ไขใน HEAD (ในสาขาที่คุณกำลังผสาน)

ดังนั้นคุณต้องตัดสินใจว่า

  • ลบไฟล์โดยใช้ " git rm res/layout/dialog_item.xml"

หรือ

  • ยอมรับเวอร์ชันจาก HEAD (อาจหลังจากแก้ไขแล้ว) ด้วย " git add res/layout/dialog_item.xml"

จากนั้นคุณเสร็จสิ้นการผสานกับ "git commit "

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


22
พยายามอดีต ( git rm …) แต่ฉันได้รับ…: needs mergeและrm '…'ฉันกำลังมีความยากลำบากในการตีความ และถ้าฉันพยายามคอมมิชชันstackoverflow.com/questions/19985906/…ก็ปรากฏขึ้นอีกครั้ง
Jesse Glick

17
ไม่เป็นไรในช่วงครึ่งหลังของความคิดเห็นนั้น ผลลัพธ์จาก Git ค่อนข้างน่าตกใจ แต่ดูเหมือนว่าจะไม่เป็นอันตราย
Jesse Glick

4
มีวิธีการมากมายหรือไม่? ฉันมีโครงการในมือที่ต้องพึ่งพาสิ่งภายนอกที่ฉันไม่ต้องการเก็บไว้ ดังนั้นจึงมีไฟล์จำนวนมากที่ถูกแก้ไขอัปสตรีมและฉันต้องการที่จะลบในสาขาของฉันที่ฉันรีบูตไม่ว่าจะเกิดอะไรขึ้น มันน่าเบื่อที่จะทำทีละคน
mlt

2
@mit: คุณสามารถใช้git ls-files --stageและ / หรือgit status --porcelainและ / หรือgit diff-files <something>รับรายการไฟล์ที่มีการเปลี่ยนแปลงและขับสคริปต์เพื่อลบหรือยอมรับเวอร์ชันของคุณ
Jakub Narębski

1
@Honey: ข้อความ CONFLICT มีคำอธิบายเกี่ยวกับการเปลี่ยนแปลงที่สาขาใด คุณสามารถตรวจสอบในภายหลังด้วยหรือgit status git diff --ccนอกจากนี้ยังมีgit log --mergeสิ่งที่อาจช่วย ...
Jakub Narębski

74

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

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

yes d | git mergetool -- the/subdirectory

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

Use (m)odified or (d)eleted file, or (a)bort?

1
@ BrianMinton ฉันเหมือนกันสิ่งอื่น ๆ ก็เป็นเพียงวงจรอุบาทว์
เนท L

2
สิ่งนี้จะน่ารำคาญเมื่อไฟล์จำนวนมากมีวิธีตอบคำถามทั้งหมดหรือไม่?
ideasman42

2
@ ideasman42 ฉันได้อัปเดตคำตอบของฉันเพื่อแสดงโซลูชันการลบแบทช์
void.pointer

1
ฉันไม่รู้เกี่ยวกับการรวมเครื่องมือจริงๆ คุณบันทึกเพื่อนวันของฉัน!
Mert

6

หากคุณใช้ Git Gui บน windows

  1. ยกเลิกการผสาน
  2. ตรวจสอบให้แน่ใจว่าคุณอยู่ในสาขาเป้าหมายของคุณ
  3. ลบไฟล์ที่ขัดแย้งจาก explorer
  4. สแกนซ้ำสำหรับการเปลี่ยนแปลงใน Git Gui (F5)
  5. ขอให้สังเกตว่าไฟล์ที่ขัดแย้งจะถูกลบ
  6. เลือกไฟล์ที่เปลี่ยนสถานะเป็น "ยอมรับ" (Ctrl-I) จากเมนูยอมรับ
  7. ป้อนความคิดเห็นที่ยอมรับเช่น "ไฟล์ที่ขัดแย้งที่ถูกลบ"
  8. กระทำ (ctrl-enter)
  9. ตอนนี้ถ้าคุณเริ่มต้นการรวมใหม่ (หวังว่า) จะทำงาน

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