xung đột hợp nhất git rebase


91

Tôi đã tạo một repo github và làm việc trên github repo của mình.
Tôi đã thực hiện các yêu cầu kéo và nó đã được hoàn thành.

Sau đó, phần ngược dòng có thêm một số cam kết nên bây giờ tôi muốn căn cứ lại, tôi đoán đó là những gì tôi phải làm.
Nhưng tôi nhận được những xung đột hợp nhất này:

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

Tôi không biết làm thế nào để khắc phục những điều này, xin vui lòng giúp đỡ.


Hãy nhìn vào câu trả lời của tôi trong bài viết này: stackoverflow.com/questions/48307297/...
Abhishek

Câu trả lời:


122

Phục hồi có thể là một vấn đề thực sự đau đầu. Bạn phải giải quyết các xung đột hợp nhất và tiếp tục phục hồi. Ví dụ: bạn có thể sử dụng công cụ hợp nhất (công cụ này khác nhau tùy thuộc vào cài đặt của bạn)

git mergetool

Sau đó, thêm các thay đổi của bạn và tiếp tục

git rebase --continue

Chúc may mắn


2
có phục hồi là đau đầu, tôi có thể sử dụng git pull ngược tổng thể?
pahnin

2
Có bạn có thể thử điều đó. Sự khác biệt là cam kết của bạn không được đặt lên trên những cam kết từ đầu nguồn. Có thể có ít xung đột hợp nhất hơn.
iltempo

7
@iitempo Bạn không cần thực hiện cam kết. Chỉ cần thêm git là đủ để cho phép rebase tiếp tục.
enigmaticPhysicist

46

Khi bạn gặp xung đột trong quá trình rebase, bạn có ba tùy chọn:

  • Bạn có thể chạy git rebase --abortđể hoàn tác hoàn toàn rebase. Git sẽ đưa bạn trở lại trạng thái nhánh của bạn như trước khi git rebase được gọi.

  • Bạn có thể chạy git rebase --skipđể hoàn toàn bỏ qua cam kết. Điều đó có nghĩa là không có thay đổi nào được giới thiệu bởi cam kết có vấn đề sẽ được bao gồm. Rất hiếm khi bạn chọn tùy chọn này.

  • Bạn có thể khắc phục xung đột như iltempo đã nói. Khi bạn hoàn tất, bạn sẽ cần gọi git rebase --continue. Mergetool của tôi là kdiff3 nhưng có nhiều cái khác mà bạn có thể sử dụng để giải quyết xung đột. Bạn chỉ cần đặt công cụ hợp nhất của mình trong cài đặt của git để nó có thể được gọi khi bạn gọi git mergetool https://git-scm.com/docs/git-mergetool

Nếu không có cách nào ở trên phù hợp với bạn, hãy đi dạo và thử lại :)


2
Có, nhưng làm thế nào để khắc phục sự bối rối? Đó là câu hỏi. Điều gì là giữa "khắc phục xung đột" và "khi bạn kết thúc"
KansaiRobot

@KansaiRobot Một tùy chọn để hoàn thành việc sửa lỗi thủ công: mở tệp bị xung đột trong trình soạn thảo văn bản và tìm kiếm<<<<<
spinup

16

Nếu bạn có nhiều cam kết để rebase, và một số phần trong số chúng đang gây ra xung đột, thì điều đó thực sự gây tổn hại. Nhưng tôi có thể đề xuất một cách tiếp cận ít được biết đến như thế nào để "giải quyết mọi xung đột".

Đầu tiên, kiểm tra chi nhánh tạm thời và bắt đầu hợp nhất tiêu chuẩn

git checkout -b temp
git merge origin/master

Bạn sẽ phải giải quyết những xung đột, nhưng chỉ một lần và duy nhất những xung đột thực sự. Sau đó sắp xếp tất cả các tệp và kết thúc quá trình hợp nhất.

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

Sau đó, quay trở lại chi nhánh của bạn (để nó là alpha ) và bắt đầu rebase, nhưng với tính năng tự động giải quyết mọi xung đột.

git checkout alpha
git rebase origin/master -X theirs

Chi nhánh đã được phục hồi, nhưng dự án có thể ở trạng thái không hợp lệ. Được rồi, chúng ta còn một bước cuối cùng. Chúng tôi chỉ cần khôi phục trạng thái dự án, vì vậy nó sẽ chính xác như trên nhánh 'tạm thời'. Về mặt kỹ thuật, chúng ta chỉ cần sao chép cây của nó (trạng thái thư mục) thông qua lệnh cấp thấp git commit-tree . Cộng với việc hợp nhất vào nhánh hiện tại vừa tạo cam kết.

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

Và xóa chi nhánh tạm thời

git branch -D temp

Đó là tất cả. Chúng tôi đã rebase thông qua hợp nhất ẩn.

Ngoài ra, tôi đã viết một kịch bản, để có thể thực hiện theo cách thức đối thoại, bạn có thể tìm thấy nó ở đây .


13

Lưu ý: với Git 2.14.x / 2.15 (Q3 2017), git rebasethông báo trong trường hợp xung đột sẽ rõ ràng hơn.

Xem cam kết 5fdacc1 (16 tháng 7 năm 2017) bởi William Duclot ( williamdclt) .
(Được hợp nhất bởi Junio ​​C Hamano - gitster- trong cam kết 076eeec , ngày 11 tháng 8 năm 2017)

rebase: làm cho thông báo giải quyết rõ ràng hơn cho người dùng thiếu kinh nghiệm

Trước:

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"

Sau:

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

Giao diện người dùng git có thể được cải thiện bằng cách giải quyết các thông báo lỗi cho những người mà họ trợ giúp: người dùng git thiếu kinh nghiệm và thông thường.
Với mục đích này, sẽ rất hữu ích khi đảm bảo rằng phân khúc người dùng này có thể hiểu các thuật ngữ được sử dụng trong các thông báo đó và hướng dẫn họ giải quyết vấn đề.

Đặc biệt, việc không thể áp dụng bản vá trong quá trình git rebase là một vấn đề phổ biến có thể gây mất ổn định cho người dùng thiếu kinh nghiệm.
Điều quan trọng là phải dẫn dắt họ đến hướng giải quyết xung đột (đây là một quy trình gồm 3 bước, do đó phức tạp) và trấn an họ rằng họ có thể thoát khỏi tình huống mà họ không thể giải quyết " --abort".
Cam kết này trả lời hai điểm đó bằng cách trình bày chi tiết quá trình giải quyết và bằng cách tránh ngôn ngữ git khó hiểu.


1
Đẹp! Trang trợ giúp cho biết giải quyết xung đột bằng cách thực hiện thay đổi, nhưng không! Ở đây chúng ta cần bỏ qua cam kết và thay vào đó chỉ cần tiếp tục hợp nhất! (trang trợ giúp: help.github.com/articles/… )
Jerther
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.