git rebase ผสานความขัดแย้ง


93

ฉันแยก github repo และทำงานกับ repo github ของฉัน
ฉันได้ทำการดึงคำขอและมันก็เสร็จสมบูรณ์

หลังจากนั้นต้นน้ำก็มีความมุ่งมั่นมากขึ้นดังนั้นตอนนี้ฉันต้องการตั้งฐานใหม่ฉันเดาว่านั่นคือสิ่งที่ฉันต้องทำ
แต่ฉันได้รับความขัดแย้งในการรวมเหล่านี้:

First, rewinding head to replay your work on top of it...
Applying: Issue 135 homepage refresh
Using index info to reconstruct a base tree...
<stdin>:17: trailing whitespace.
      %h4 
warning: 1 line adds whitespace errors.
Falling back to patching base and 3-way merge...
Auto-merging app/views/layouts/application.html.haml
CONFLICT (content): Merge conflict in app/views/layouts/application.html.haml
Auto-merging app/views/home/index.html.haml
CONFLICT (content): Merge conflict in app/views/home/index.html.haml
Auto-merging app/views/home/_group_projects.html.haml
CONFLICT (content): Merge conflict in app/views/home/_group_projects.html.haml
Failed to merge in the changes.
Patch failed at 0001 Issue 135 homepage refresh

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".

ฉันไม่ทราบวิธีแก้ไขโปรดช่วยด้วย


ดูคำตอบของฉันในโพสต์นี้: stackoverflow.com/questions/48307297/…
Abhishek

คำตอบ:


125

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

git mergetool

จากนั้นเพิ่มการเปลี่ยนแปลงของคุณและดำเนินการต่อ

git rebase --continue

โชคดี


2
ใช่การรีเบตเป็นอาการปวดหัวฉันสามารถใช้ git pull upstream master ได้หรือไม่?
pahnin

2
ใช่คุณสามารถลองได้ ความแตกต่างคือการกระทำของคุณไม่ได้ถูกใส่ไว้เหนือสิ่งเหล่านั้นตั้งแต่ต้นน้ำ อาจมีความขัดแย้งในการผสานน้อยกว่า
iltempo

7
@iitempo คุณไม่จำเป็นต้องกระทำ เพียงแค่เพิ่มคอมไพล์ก็เพียงพอที่จะทำให้ rebase ดำเนินการต่อได้
enigmaticPhysicist

47

เมื่อคุณมีข้อขัดแย้งระหว่างการสร้างฐานใหม่คุณมีสามทางเลือก:

  • คุณสามารถเรียกใช้git rebase --abortเพื่อเลิกทำการ rebase โดยสมบูรณ์ Git จะทำให้คุณกลับสู่สถานะสาขาของคุณเหมือนเดิมก่อนที่จะเรียก git rebase

  • คุณสามารถเรียกใช้git rebase --skipเพื่อข้ามการกระทำโดยสิ้นเชิง นั่นหมายความว่าจะไม่มีการเปลี่ยนแปลงใด ๆ ที่นำมาใช้โดยคอมมิตที่เป็นปัญหา เป็นเรื่องยากมากที่คุณจะเลือกตัวเลือกนี้

  • คุณสามารถแก้ไขข้อขัดแย้งได้ตามที่ iltempo กล่าว git rebase --continueเมื่อคุณทำเสร็จแล้วคุณจะต้องโทร mergetool ของฉันคือ kdiff3 แต่มีอีกมากมายที่คุณสามารถใช้เพื่อแก้ปัญหาความขัดแย้ง คุณต้องตั้งค่าเครื่องมือผสานของคุณในการตั้งค่าของ git เท่านั้นจึงจะสามารถเรียกใช้งานได้เมื่อคุณโทรไปที่git mergetool https://git-scm.com/docs/git-mergetool

หากข้อใดข้างต้นไม่เหมาะกับคุณให้ไปเดินเล่นและลองอีกครั้ง :)


2
ใช่ แต่จะแก้ไข Conflic ได้อย่างไร? นั่นคือคำถามระหว่าง "แก้ไขความขัดแย้ง" กับ "เมื่อคุณทำเสร็จแล้ว"
อะไร

@KansaiRobot ทางเลือกหนึ่งในการแก้ไขปัญหาด้วยตนเอง: เปิดไฟล์ที่ขัดแย้งในโปรแกรมแก้ไขข้อความแล้วมองหา<<<<<
spinup

18

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

ขั้นแรกให้ชำระเงินสาขาชั่วคราวและเริ่มการรวมมาตรฐาน

git checkout -b temp
git merge origin/master

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

git commit -m "Merge branch 'origin/master' into 'temp'"

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

git checkout alpha
git rebase origin/master -X theirs

สาขาได้รับการปรับใหม่ แต่โครงการอาจอยู่ในสถานะไม่ถูกต้อง ไม่เป็นไรเรามีขั้นตอนสุดท้าย เราเพียงแค่ต้องกู้คืนสถานะโครงการดังนั้นจึงจะถูกต้องตามที่สาขา 'temp' ในทางเทคนิคเราก็ต้องคัดลอกของต้นไม้ (รัฐโฟลเดอร์) ผ่านคำสั่งระดับต่ำคอมไพล์กระทำต้นไม้ การรวมเข้ากับสาขาปัจจุบันเพิ่งสร้างคอมมิต

git merge --ff $(git commit-tree temp^{tree} -m "Fix after rebase" -p HEAD)

และลบสาขาชั่วคราว

git branch -D temp

นั่นคือทั้งหมด เราทำการ rebase ผ่านการผสานที่ซ่อนอยู่

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


13

หมายเหตุ: ด้วย Git 2.14.x / 2.15 (Q3 2017) git rebaseข้อความในกรณีที่มีความขัดแย้งจะชัดเจนขึ้น

ดูกระทำ 5fdacc1 (16 กรกฎาคม 2017) โดยวิลเลียม Duclot (williamdclt )
(รวมโดยJunio C Hamano - gitster-ในการกระทำ 076eeec , 11 สิงหาคม 2017)

rebase: ทำให้ข้อความแก้ไขชัดเจนขึ้นสำหรับผู้ใช้ที่ไม่มีประสบการณ์

ก่อน:

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"

หลังจาก:

Resolve all conflicts manually, 
mark them as resolved with git add/rm <conflicted_files>
then run "git rebase --continue".

You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".')

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

โดยเฉพาะอย่างยิ่งความล้มเหลวในการใช้โปรแกรมแก้ไขในระหว่าง git rebase เป็นปัญหาทั่วไปที่อาจทำให้ผู้ใช้ที่ไม่มีประสบการณ์ไม่เสถียร
เป็นสิ่งสำคัญที่จะต้องนำพวกเขาไปสู่การแก้ไขความขัดแย้ง (ซึ่งเป็นกระบวนการ 3 ขั้นตอนจึงซับซ้อน) และสร้างความมั่นใจว่าพวกเขาจะรอดพ้นจากสถานการณ์ที่ไม่สามารถรับมือได้ " --abort"
สิ่งนี้ตอบโจทย์ทั้งสองประเด็นนี้โดยการให้รายละเอียดเกี่ยวกับกระบวนการแก้ไขปัญหาและหลีกเลี่ยงการใช้ภาษาคอมไพล์


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