Xung đột hợp nhất Git rebase không thể tiếp tục


131

Tôi đang cố gắng đuổi theo 'dev' để bắt kịp nhánh 'master'.

$ git checkout dev 
$ git rebase master 
First, rewinding head to replay your work on top of it...
Applying: Corrected compilation problems that came from conversion from SVN.
Using index info to reconstruct a base tree...
M       src/com/....
<stdin>:125: trailing whitespace.
/**
<stdin>:126: trailing whitespace.
 *
<stdin>:127: trailing whitespace.
 */
<stdin>:128: trailing whitespace.
package com....
<stdin>:129: trailing whitespace.

warning: squelched 117 whitespace errors
warning: 122 lines add whitespace errors.
Falling back to patching base and 3-way merge...
Auto-merging src/com/....
CONFLICT (content): Merge conflict in src/com/...
Failed to merge in the changes.
Patch failed at 0001 Corrected compilation problems that came from conversion from SVN.

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

$ vi src/com/.....   { fixed the merge issue on one file } 
$ git add -A . 
$ git rebase --continue 
src/com/....: needs merge
You must edit all merge conflicts and then
mark them as resolved using git add
$ vi src/com....      { verified, no >>> or <<< left, no merge markers } 
$ git rebase --continue 
Applying: Corrected compilation problems that came from conversion from SVN.
No changes - did you forget to use 'git add'?
If there is nothing left to stage, chances are that something else
already introduced the same changes; you might want to skip this patch.

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

Có ý kiến ​​gì không?


Lưu ý: có những trường hợp a git rebase --skipvẫn có thể không hoạt động đúng. Cho đến Git 2.0.2 (tháng 7 năm 2014). Xem câu trả lời của tôi dưới đây
VonC

Câu trả lời:


223

Có một vài tình huống mà tôi thấy rebasebị mắc kẹt. Một là nếu các thay đổi trở thành null (một cam kết có các thay đổi đã được thực hiện trước đó trong rebase) trong trường hợp bạn có thể phải sử dụng git rebase --skip.

Nó khá dễ để nói. Nếu bạn làm điều git statusđó sẽ hiển thị không có thay đổi. Nếu vậy chỉ cần bỏ qua nó. Nếu đó không phải là trường hợp xin vui lòng gửi một bản sao git statusvà tôi có thể cố gắng giúp thêm.


Không, đó là, không có thay đổi "không". Tôi đã bỏ qua nó và so sánh các tập tin sau đó nó là những gì nó cần phải có.
awm

Điều này đã giúp tôi khi 'git pull gốc --rebase bậc thầy" của tôi dường như bị kẹt trong một vòng lặp giữa cần phải xung đột quyết tâm và bỏ qua Sau khi kiên nhẫn hơn một chút, tôi cố định, ty.!
AnneTheAgile

3
trạng thái git trả về: "rebase đang tiến hành; vào <commitnumber> Bạn hiện đang khởi động lại nhánh '<Branchname>' trên '<commitnumber>'. git rebase - liên tục trả về không có thay đổi trong khi git rebase --skip làm nhưng trong trường hợp của tôi, tôi gặp tình huống đó nhiều lần. Điều đó đúng hay có gì sai?
adi

Cảm ơn. Tôi đã lo lắng --skipsẽ làm tồi tệ hơn là chỉ tiếp tục với những thay đổi tôi đã thực hiện.
jchook

Trong trường hợp của tôi, cả Intellij Idea GUI và SourceTree đều cho thấy rằng mỗi tệp đã được thêm vào cam kết, trong khi git statuscho thấy, có một tệp đã được sửa đổi, nhưng không được thêm vào cam kết. Thực hiện add somefile.txtđược phép tiếp tục với việc nổi loạn.
azizbekian

16

Một trong những lần tôi gặp phải vấn đề này là khi thực hiện git commitsau a git add. Vì vậy, trình tự sau đây sẽ tạo ra lỗi rebase mà bạn đề cập:

git add <file with conflict>
git commit -m "<some message>"
git rebase --continue

Trong khi, chuỗi bên dưới chạy mà không có bất kỳ lỗi nào và tiếp tục rebase:
git add <file with conflict>
git rebase --continue

Có thể git add -Avới tùy chọn "Tất cả" đang tạo ra một tình huống tương tự. (Xin lưu ý, tôi rất thiếu kinh nghiệm trong git, vì vậy câu trả lời này có thể không đúng.) Để an toàn, git rebase --skipdường như cũng hoạt động tốt trong tình huống này.


6

Lưu ý: Git 2.0.2 (tháng 7 năm 2014) đã sửa một trường hợp trong đó một trường hợp git rebase --skipbị kẹt và sẽ không thể tiếp tục với cuộc nổi loạn hiện tại.
Xem cam kết 95104c7 của brian m. carlson ( bk2204)

rebase--merge: sửa chữa --skipvới hai xung đột liên tiếp

Nếu git rebase --mergegặp phải xung đột, --skipsẽ không hoạt động nếu lần xác nhận tiếp theo cũng bị xung đột .
Tập msgnumtin sẽ không bao giờ được cập nhật với số bản vá mới, vì vậy không có bản vá nào thực sự bị bỏ qua, dẫn đến một vòng lặp không thể giải thích được.

Cập nhật msgnumgiá trị của tệp là điều đầu tiên trong call_merge.
Điều này cũng tránh Already appliedthông báo "" khi bỏ qua một cam kết.
Không có thay đổi có thể nhìn thấy cho các bối cảnh khác trong đó call_merge được gọi, vì giá trị của tệp msgnum không thay đổi trong các tình huống đó.


3
$ vi src/com....      { verified, no >>> or <<< left, no merge markers } 
$ git rebase --continue 

Có vẻ như bạn đã quên git addnhững thay đổi của mình ...


Đó chỉ là một "xác minh" không cần thay đổi lần thứ 2 ... git add đã ở ngay trên nó.
awm

Đúng, bạn đã sử dụng git addvà sau đó tiếp tục hợp nhất, và nó dừng lại vì một tệp khác có xung đột, vì vậy bạn cũng cần sửa nó. Am i thiếu cái gì ở đây?
John Brodie

1
Đó là cùng một tệp đang báo cáo nhu cầu hợp nhất. ok chỉ với bạn tôi sẽ làm một "git add" khác, nhưng đó là kết quả tương tự.
ôi

Cảm ơn! Đó là tình huống của tôi: Tôi đã giải quyết xung đột nhưng không dàn dựng các thay đổi.
Kirill
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.