ฉันจะเสร็จสิ้นการผสานหลังจากแก้ไขข้อขัดแย้งการผสานของฉันได้อย่างไร


282

ฉันได้อ่านBasic Branching and Mergingของ Git Community Book แล้ว

experimentalดังนั้นผมจึงทำตามมันและสร้างสาขาที่หนึ่ง:

แล้วฉัน:

  1. เปลี่ยนเป็นสาขาทดลอง (ทดลองชำระเงิน git)
  2. ทำการเปลี่ยนแปลงมากมาย
  3. กระทำมัน (git กระทำ -a)
  4. เปลี่ยนเป็นสาขาหลัก (git checkout master)
  5. ทำการเปลี่ยนแปลงและกระทำที่นั่น
  6. สลับกลับไปยังการทดลอง (ทดลองใช้การชำระเงิน git)
  7. การผสานข้อมูลหลักเปลี่ยนเป็นการทดลอง (git merge master)
  8. มีความขัดแย้งบางอย่าง แต่หลังจากที่ฉันแก้ไขพวกเขาฉันได้ 'git เพิ่ม myfile'

  9. และตอนนี้ฉันติดอยู่ฉันไม่สามารถย้ายกลับไปเป็นอาจารย์ได้

เมื่อฉันทำ

 $ git checkout master
error: Entry 'res/layout/my_item.xml' would be overwritten by merge. Cannot merge.

และฉันก็:

$ git rebase --abort

ไม่มีการรีบูต

และฉันก็:

$  git add res/layout/socialhub_list_item.xml
$ git checkout master
error: Entry 'res/layout/my_item.xml' would be overwritten by merge. Cannot merge.

ฉันสามารถทำอะไรได้บ้างเพื่อกลับไปที่สาขาหลักของฉัน


หลังจากที่ฉันแก้ไขข้อขัดแย้งดำเนินการเพิ่มและจากนั้นพยายามที่จะกระทำที่มีgit commit gf2n.cpp -m "Hand merge gf2n.cpp due to conflicts"ผลก็fatal: cannot do a partial commit during a merge.มา และแน่นอนว่า"ความมุ่งมั่นบางส่วน"ดูเหมือนจะไม่ได้รับการบันทึกหรือพูดคุยที่ใดก็ได้ในหน้า man git การดำเนินการgit mergeหลังจากการแก้ไขให้ผลลัพธ์ในเครื่องมือPlease, commit your changes before you can merge.What a ass ที่เสียหาย ...
jww

2
คอมไพล์กระทำด้วยเส้นทางที่ชัดเจนถูกบันทึกไว้ใน manpage ใน DESCRIPTION "เป็น" 3 โดยการแสดงรายการไฟล์เป็นอาร์กิวเมนต์ของคำสั่ง commit ในกรณีนี้การคอมมิทจะเพิกเฉยต่อการเปลี่ยนแปลงที่เกิดขึ้นในดัชนีและแทนที่จะบันทึกเนื้อหาปัจจุบันของไฟล์ที่อยู่ในรายการ (ซึ่งต้องรู้จัก Git); "และภายใต้ '- - ตัวเลือก 'เพียงอย่างเดียวฉันค่อนข้างแน่ใจว่าข้อความผสานถูกเขียนโดยคนที่คิดว่าคุณอ่านวิธีการทำงานของคำสั่ง commit และสามารถจดจำความหมายของคำว่า "บางส่วน" ในคำอธิบายนั้นได้ อีกครั้งและอย่างระมัดระวังมากขึ้น @jww
jthill

1
ดังนั้นทำไมกรณีศึกษาถึงได้รับการอ่านอย่างระมัดระวังเพื่อความเข้าใจในขณะที่ manpages ทำไม่ได้ @jww
jthill

1
การใช้คอมไพล์อย่างชัดเจนต้องใช้ความเข้าใจในการอ่านที่ดีกว่าที่คุณเตรียมไว้ ฉันอาจจะไม่แน่ใจมากกว่านี้ว่าเป็นความผิดพลาดในคอมไพล์มากกว่าที่คุณแน่ใจ
jthill

1
ด้วย Git 2.12 (ไตรมาสที่ 1 ปี 2017) คุณจะเร็ว ๆ git merge --continueนี้ก็จะทำ ดูคำตอบของฉันด้านล่าง
VonC

คำตอบ:


267

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


หากคุณใช้ "git gui &" เพื่อทำคอมมิชชัน - คุณอาจไม่ทราบว่าสถานะสาขาของคุณจะไม่ "ผสาน" อีกต่อไป การติดตามด้วย "สถานะ git" จะเป็นประโยชน์เพื่อให้แน่ใจว่าสถานะสาขาของคุณถูกต้อง
Tony Ashworth

4
ลองgit commit -am "your commit message"ทำการเพิ่มและส่งพร้อมกัน
vaheeds

3
git commitทำงานได้ดี และเป็นการดีที่สุดที่จะใช้เพื่อรับข้อความยืนยันการรวมเริ่มต้นที่มีให้สำหรับคุณ ฉันหลีกเลี่ยง `git commit -am" เนื่องจากมันจะแทนที่ข้อความ
Arijoon

1
ลองgit pushดู
Alper

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

157

ฉันจะเสร็จสิ้นการผสานหลังจากแก้ไขข้อขัดแย้งการผสานของฉันได้อย่างไร

ด้วย Git 2.12 (Q1 2017) คุณจะมีคำสั่งที่เป็นธรรมชาติมากขึ้น:

git merge --continue

ดูกระทำ c7d227d (15 ธันวาคม 2016) โดยเจฟฟ์คิง (peff )
ดูกระทำ 042e290 , กระทำ c261a87 , กระทำ 367ff69 (14 ธันวาคม 2016) โดยคริส Packham (cpackham )
(ผสานโดยJunio ​​C Hamano - gitster-ในการกระทำ 05f6e1b , 27 ธันวาคม 2559)

ดู2.12 บันทึกประจำรุ่น

merge: เพิ่ม--continueตัวเลือก '' เป็นคำพ้องความหมายสำหรับ ' git commit'

สอน ' git merge' --continueตัวเลือกที่ช่วยให้คุณสามารถ 'ต่อไป' โดยรวมได้
วิธีดั้งเดิมของการผสานหลังจากแก้ไขข้อขัดแย้งคือการใช้ ' git commit'
ขณะนี้มีคำสั่งเช่น ' git rebase' และ ' git cherry-pick' ที่มี--continueตัวเลือก '' เพิ่มตัวเลือกเช่น '' เพื่อgit mergeนำเสนอ UI ที่สอดคล้องกัน


ฉันพร้อมที่จะโพสต์ความคิดเห็นเกี่ยวกับวิธีการเพิ่มสิ่งนี้เมื่อเร็ว ๆ นี้ใน 2.12 ในไตรมาสที่ 1 ปี 2560 แต่จากนั้นฉันอ่านบรรทัดแรกของคำตอบของคุณ ไม่น่าแปลกใจที่ไม่พบตัวเลือกสำหรับฉันในเวอร์ชัน 2.10!
cjsimon

1
ฉันลองคอมไพล์ผสาน - หยุดและ Git Bash ไม่สามารถรับรู้ได้ว่าเป็นคำสั่ง แต่สิ่งที่ใช้ได้ก็คือคอมไพล์ -m "Commit message"
Mimi

2
@Mimi ตกลง แต่คุณใช้ Git 2.12 ขึ้นไป
VonC

@VonC คุณถูกต้องฉันใช้ Git รุ่นเก่ากว่า!
มีมี่

23

ในกรณีที่คุณเคยติดระหว่างการรวม / rebase คุณสามารถทำได้ตลอดเวลา

git reset --hard

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


16
คำเตือนบังคับ: git reset --hardทิ้งการเปลี่ยนแปลงที่ไม่มีข้อผูกมัด
เจฟฟรีย์เฮล

2
ทำไมไม่เป็นเช่นgit merge --abortนั้นซึ่งไม่มีความเสี่ยงในการสูญเสียอะไรเลย?
Alexander George

11

แค่git commitนี้แหละ

อีกทางเลือกหนึ่งgit abort:
ฉันพบความขัดแย้งในการผสาน ฉันจะยกเลิกการรวมได้อย่างไร

เพื่อให้ชีวิตง่ายขึ้นด้วยการรวมการติดตั้ง kdiff3 และกำหนดค่าเป็น mergetool คำแนะนำ: http://doodkin.com/2016/05/29/git-merge-easy-github-this-branch-has-conflicts-that-must-be-resolved-use-the-command-line/

หน้านั้นมีวิดีโอนี้: https://www.youtube.com/watch?v=Cc4xPp7Iuzo


11

เมื่อใดก็ตามที่คุณรวมสองสาขาโดยใช้คำสั่งgit merge brancha branchbมีความเป็นไปได้สองอย่าง:

  1. อีกสาขาหนึ่ง (ให้พูด brancha) สามารถเข้าถึงได้โดยสาขาอื่น (ให้พูด branchb) โดยทำตามประวัติของการกระทำในกรณีนี้ git เพียงแค่กรอไปข้างหน้าอย่างรวดเร็วหัวเพื่อชี้ไปที่สาขาล่าสุด (ในกรณีนี้ branchb)

    2.But ถ้าสาขาทั้งสองแยกจากกันที่จุดเก่าแล้ว git สร้าง snapshot ใหม่และเพิ่มการกระทำใหม่ที่ชี้ไปที่มัน ดังนั้นในกรณีที่ไม่มีความขัดแย้งระหว่างสาขาที่คุณรวมเข้าด้วยกันคอมไพล์ก็จะสร้างความมุ่งมั่นใหม่

เรียกใช้git logเพื่อดูการกระทำหลังจากที่คุณรวมสาขาที่ไม่ขัดแย้งกันสองสาขาเข้าด้วยกัน

ตอนนี้กลับมาที่กรณีที่น่าสนใจเมื่อมีการรวมความขัดแย้งระหว่างสาขาที่ผสาน ฉันพูดแบบนี้จากหน้าhttps://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging

Git ยังไม่ได้สร้างการผสานใหม่โดยอัตโนมัติ มันหยุดกระบวนการชั่วคราวขณะที่คุณแก้ไขข้อขัดแย้ง หากคุณต้องการดูว่าไฟล์ใดที่ไม่ได้รวมในจุดใด ๆ หลังจากเกิดข้อขัดแย้งในการผสานคุณสามารถเรียกใช้git status


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


7

ขั้นตอนถัดไปหลังจากแก้ไขข้อขัดแย้งด้วยตนเอง ได้แก่ : -

  1. คอมไพล์เพิ่ม
  2. สถานะ git (จะแสดงให้คุณเห็นว่าคำสั่งใดที่จำเป็นในการดำเนินการผสานอัตโนมัติต่อไป)
  3. [คำสั่งคอมไพล์แสดงให้เห็นเช่นgit merge --continue, git cherry-pick --continue, git rebase --continue]

16
ไม่มีคอมไพล์ผสาน
Hola Soy Edu Feliz Navidad

@HolaSoyEduFelizNavidad นี่ไม่ถูกต้อง Zie คอมไพล์เอาท์ด้านล่างหลังจากความขัดแย้ง: - error: Failed to merge in the changes. Patch failed at 0001 ADD: _type to styleguide The copy of the patch that failed is found in: .git/rebase-apply/patch When you have resolved this problem, run "git rebase --continue". If you prefer to skip this patch, run "git rebase --skip" instead. To check out the original branch and stop rebasing, run "git rebase --abort".
Timidfriendly

5
มีการรีบูต - หยุดไม่รวม
Hola Soy Edu Feliz Navidad

git merge --continueผลลัพธ์ที่ฉันพยายามทำคือerror: unknown option 'continue'อะไร ฉันเชื่อว่าคำตอบของคุณไม่ถูกต้องเนื่องจากgit-mergeหน้า manไม่อยู่ในรายการ คุณใช้ Git เวอร์ชันใด git version 1.8.5.2 (Apple Git-48)ฉันใช้ ฉันยังพยายามกับ git version 2.9.3MacPorts
jww

1
ด้วยคอมไพล์ 2.10 สำหรับการผสานอย่างง่ายคำสั่งเก่าธรรมดาgit commit
Chris Charabaruk

2

ความขัดแย้งในการผสานเกิดขึ้นเมื่อสองสาขาที่คุณพยายามผสานทั้งสองเปลี่ยนส่วนเดียวกันของไฟล์เดียวกัน git statusคุณสามารถสร้างรายชื่อของความขัดแย้งกับ

เมื่อพบบรรทัดที่ขัดแย้งกัน Git จะแก้ไขเนื้อหาของไฟล์ที่ได้รับผลกระทบด้วยตัวบ่งชี้ภาพที่ทำเครื่องหมายทั้งสองด้านของเนื้อหาที่ขัดแย้งกัน

<<<<<<< HEAD
conflicted text from HEAD
=======
conflicted text from merging_branch
>>>>>>> merging_branch

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

บทความอ้างอิง: Git ผสาน


2

หลังจากเพิ่มไฟล์ทั้งหมดแล้วขั้นตอนต่อไปคือ " git commit "

"สถานะ git" จะแนะนำสิ่งที่ต้องทำ: ไฟล์ที่ยังไม่ได้เพิ่มแสดงอยู่ที่ด้านล่างและเมื่อเสร็จสิ้นทั้งหมดแล้วมันจะแนะนำการกระทำที่ด้านบนซึ่งจะอธิบายสถานะการรวมของสาขาปัจจุบัน


1

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

เมื่อคุณทำ $ git merge สิ่งที่เกิดขึ้นจริงคือ git พยายามที่จะส่งต่อสาขาปัจจุบันของคุณไปยังการคอมมิชชันสาขาที่อ้างอิงอยู่ (ในคำอื่น ๆ ทั้งสองชื่อสาขาชี้ไปที่คอมมิทเดียวกัน) สถานการณ์นี้ง่ายที่สุดสำหรับคอมไพล์ เพื่อจัดการเนื่องจากไม่มีความมุ่งมั่นใหม่ คิดว่าการกระโดดมาสเตอร์บนลิลิปาดกิ่งของคุณกำลังหนาวสั่น เป็นไปได้ที่จะตั้งค่าแฟล็ก --no-ff ซึ่งในกรณีนี้คอมไพล์จะสร้างคอมมิทใหม่โดยไม่คำนึงว่ามีรหัสที่ขัดแย้งกันหรือไม่

ในสถานการณ์ที่มีความขัดแย้งของรหัสระหว่างสองสาขาที่คุณพยายามผสาน (โดยปกติแล้วจะเป็นสองสาขาที่ประวัติการกระทำร่วมกันกระทำการกระทำร่วมกันในอดีต) การกรอไปข้างหน้าจะไม่ทำงาน git อาจยังสามารถรวมไฟล์ได้โดยอัตโนมัติตราบใดที่ทั้งสองสาขาไม่เปลี่ยนแปลงในไฟล์ที่ขัดแย้งกัน ในกรณีนี้คอมไพล์จะรวมไฟล์ที่ขัดแย้งกันให้คุณและคอมมิทอัตโนมัติ คุณสามารถดูตัวอย่างว่า git ทำอย่างไรโดยทำ $ git diff --cached หรือคุณสามารถส่งผ่าน --no-commit flag ไปยังคำสั่ง merge ซึ่งจะทำให้ไฟล์ที่ถูกแก้ไขในดัชนีของคุณคุณจะต้องเพิ่มและกระทำ แต่คุณสามารถ $ git diff ไฟล์เหล่านี้เพื่อตรวจสอบว่าการผสานจะเปลี่ยนไปอย่างไร

สถานการณ์ที่สามคือเมื่อมีความขัดแย้ง git ไม่สามารถแก้ไขได้โดยอัตโนมัติ ในกรณีนี้คุณจะต้องรวมพวกเขาด้วยตนเอง ในความคิดของฉันนี้เป็นเรื่องง่ายที่สุดที่จะทำกับการรวมเอาเช่น araxis ผสานหรือ p4merge (ฟรี) ไม่ว่าจะด้วยวิธีใดคุณต้องทำทีละไฟล์ หากดูเหมือนว่าการรวมจะติดขัดให้ใช้การ $ git เวียน - หยุดเพื่อสะกิดมันไป Git ควรบอกคุณถ้ามันไม่สามารถดำเนินการต่อและถ้าเป็นเช่นนั้นทำไมไม่ หากคุณรู้สึกว่าคุณรวมการผสานในบางจุดคุณสามารถทำ $ git merge --abort และการผสานใด ๆ จะยกเลิกและคุณสามารถเริ่มต้นใหม่ได้ เมื่อเสร็จแล้วแต่ละไฟล์ที่คุณรวมจะเป็นไฟล์ที่ถูกแก้ไขซึ่งจะต้องมีการเพิ่มและยืนยัน คุณสามารถตรวจสอบว่าไฟล์อยู่ที่ไหนด้วยสถานะ $ git หากคุณยังไม่ได้คอมมิทไฟล์ที่รวมไว้ คุณต้องทำเช่นนั้นเพื่อให้การผสานเสร็จสมบูรณ์


0

มันอาจจะสาย มันเกิดขึ้นเพราะ HEAD คอมไพล์ของคุณไม่ได้รับการอัพเดท git reset HEADยกย่องนี้จะแก้ว่า

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