2011-12-15 29 views
55

Tôi đang đối mặt với một vấn đề mà tôi không chắc chắn cách giải quyết.Git rebase --continue than phiền ngay cả khi tất cả các xung đột hợp nhất đã được giải quyết

Tôi đã làm một rebase chống lại chủ từ chi nhánh của tôi:

git rebase master 

và đã nhận lỗi sau

First, rewinding head to replay your work on top of it... 
Applying: checkstyled. 
Using index info to reconstruct a base tree... 
Falling back to patching base and 3-way merge... 
Auto-merging AssetsLoader.java 
CONFLICT (content): Merge conflict in AssetsLoader.java 
Failed to merge in the changes. 
Patch failed at 0001 checkstyled. 

Vì vậy, tôi đã đi để soạn thảo yêu thích của tôi, cố định các mâu thuẫn 1 dòng, lưu tập tin và đã thực hiện một trạng thái git và nhận được kết quả sau:

# Not currently on any branch. 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
# modified: PassengerContactHandler.java 
# 
# Unmerged paths: 
# (use "git reset HEAD <file>..." to unstage) 
# (use "git add/rm <file>..." as appropriate to mark resolution) 
# 
# both modified:  AssetsLoader.java 
# 

Tôi đã thêm git add AssetsLoader java và một tình trạng git và đã nhận như sau:

# Not currently on any branch. 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
# modified: AssetsLoader.java 
# modified: PassengerContactHandler.java 
# 

và khi tôi đã làm git rebase --continue tôi nhận được:

git rebase --continue 
You must edit all merge conflicts and then 
mark them as resolved using git add 

Tôi biết tôi có thể bỏ qua các bản vá và tiếp tục rebase, nhưng Tôi không chắc chắn nếu những thay đổi trong PassengerContactHandler.java sẽ được rebased vào chi nhánh của tôi hay không.

vì vậy tôi không chắc chắn, Tôi nên tiến hành như thế nào?

Chỉnh sửa: Có thể là tệp có xung đột được giải quyết giống hệt như phiên bản gốc không?

Thanks a lot, Lucas

Chỉnh sửa, nó chỉ xảy ra với tôi một lần nữa:

Nó chỉ xảy ra với tôi một lần nữa,

(307ac0d...)|REBASE)$ git status 
# Not currently on any branch. 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
# modified: assets/world/level1/Level-1.xml 
# modified: George.java 
# modified: DefaultPassenger.java 
# 
# Untracked files: 
# (use "git add <file>..." to include in what will be committed) 
# 
# mb-art/originalAssets/27dec/ 

((307ac0d ...) | rebase) $ git rebase --continue

You must edit all merge conflicts and then 
mark them as resolved using git add 

git --version

git version 1.7.1 
+0

Đó là đầu ra đầy đủ của 'trạng thái git', phải không? Không có phần thiếu bên dưới nó? – Cascabel

+0

vâng, tôi đã dán mọi thứ ... – Lucas

+0

'git-rebase' sẽ không bao giờ báo cáo rằng có xung đột chưa được giải quyết nếu không có bất kỳ sự cố nào. Nếu bạn có thể quản lý để tái tạo vấn đề trong một trường hợp thử nghiệm đơn giản hơn, nó sẽ dễ dàng hơn để gỡ lỗi, nhưng vẫn còn, nếu bạn có 'git status' báo cáo không có xung đột khi' git rebase --continue' làm, và phiên bản của bạn Git là hiện tại, bạn có thể thử gửi email danh sách gửi thư Git dev tại [email protected] với nhiều thông tin chẩn đoán như bạn có thể nhận được. – Cascabel

Trả lời

3

Bạn đã bỏ lỡ xung đột hợp nhất trong AssetsLoader.java. Mở nó lên và tìm dấu xung đột (">>>>", "====", "< < < < <") và sau đó làm git thêm lần nữa. Làm một 'git diff --staged' nếu bạn gặp khó khăn trong việc tìm kiếm nó.

+2

tôi đã làm một grep trên tất cả các tệp được theo dõi và không có dấu xung đột nào. – Lucas

+0

Có 'git diff --staged' tiết lộ bất cứ điều gì hữu ích? Điều này cho biết những thay đổi bạn sắp cam kết giải quyết (các) xung đột hợp nhất tại thời điểm này trong quá trình rebase. Nên có một "oops, đó không phải là những gì tôi dự định làm để giải quyết" bit này trong một trong các tập tin. – Ether

+4

Git không tìm kiếm các dấu xung đột hợp nhất khi bạn cố gắng di chuyển. Nó chỉ kiểm tra để thấy rằng chỉ mục ở trạng thái sạch. Nếu bạn đã tổ chức một tệp mà vẫn có các điểm đánh dấu xung đột trong đó, bạn cho biết rằng bạn muốn cam kết tệp đó với chúng trong đó. Nó có lẽ luôn luôn là một sai lầm, nhưng nó sẽ cho phép bạn làm điều đó. – Cascabel

3

Cố gắng chạy này trong dòng lệnh của bạn:

$ git mergetool 

nên đưa lên một trình soạn thảo tương tác cho phép bạn để giải quyết những mâu thuẫn. Dễ hơn là cố gắng thực hiện thủ công và cũng git sẽ nhận ra khi bạn thực hiện hợp nhất. Cũng sẽ tránh các tình huống mà bạn không hoàn toàn hợp nhất do tai nạn có thể xảy ra khi bạn cố gắng thực hiện thủ công.

+0

Vâng, tôi biết công cụ nhưng tôi muốn thực hiện nó theo cách thủ công. – Lucas

+0

Chỉ cần tìm nó có thể dễ dàng hơn và cũng sẽ cho phép bạn tránh những tình huống như thế này trong tương lai. – Batkins

+1

Bạn đã lưu buổi tối của tôi. Mặc dù đó là một công cụ đơn giản, nhưng tôi không bao giờ có thể tìm ra cách giải quyết xung đột của mình mà không có công cụ này. – Eonil

4

Ive chỉ có vấn đề này, và trong khi tôi nghĩ rằng có thể có một vài nguyên nhân, đây là của tôi ...

Tôi đã có một git pre-cam kết nối mà từ chối cam kết trong các điều kiện nhất định.Điều này là tốt khi cam kết thủ công, vì nó sẽ hiển thị đầu ra của móc, và tôi có thể sửa chữa nó hoặc chọn bỏ qua nó bằng cách sử dụng commit --no-verify.

Sự cố có vẻ là khi rebasing, rebase --continue cũng sẽ gọi móc (để cam kết lần thay đổi mới nhất). Nhưng rebase sẽ không hiển thị đầu ra móc, nó sẽ chỉ ra rằng nó thất bại, và sau đó nhả ra một lỗi nhỏ hơn nói rằng 'Bạn phải chỉnh sửa tất cả xung đột hợp nhất và đánh dấu chúng là đã giải quyết bằng git add'

nó, giai đoạn tất cả các thay đổi của bạn, và thay vì làm 'git rebase --continue', hãy thử 'git commit'. Nếu bạn đang gặp vấn đề móc tương tự, sau đó bạn sẽ thấy lý do tại sao nó không thành công.

Điều thú vị là, trong khi git rebase không hiển thị đầu ra từ git hook, nó chấp nhận a --no-verify để bỏ qua móc.

+1

Tôi gặp vấn đề tương tự. Không có gì khác ở đây làm việc cho tôi, nhưng chỉ làm 'git commit' và sau đó hủy bỏ dường như kỳ diệu giải quyết bất kỳ sự khác biệt nào, và sau đó tôi có thể 'git rebase --continue' thành công. – patrickvacek

+0

Chỉ cần cho hồ sơ, như tôi đã đấu tranh với vấn đề tương tự gần đây, 'git rebase' chấp nhận tùy chọn' --no-verify'. Tuy nhiên, nó chỉ bỏ qua hook 'pre-rebase', nhưng tùy chọn này không được áp dụng cho các lệnh gọi tiếp theo tới' git commit'. – pkrysiak

58

Điều này xảy ra vì khi sửa chữa xung đột, bạn đã xóa tất cả mã trong quá trình tạo bản vá áp dụng cho nhánh bạn đang rebasing. Sử dụng git rebase --skip để tiếp tục.

chi tiết

Một chút hơn:

Thông thường, khi sửa chữa một cuộc xung đột trong rebasing, bạn sẽ chỉnh sửa các tập tin mâu thuẫn, giữ một số hoặc tất cả các mã trong các bản vá hiện đang được áp dụng cho các chi nhánh bạn rebase trên . Sau khi sửa chữa các bản vá và làm

git add your/conflicted/file 
git status 

bạn sẽ nhận được một (thường là màu xanh lá cây) hàng hiển thị các tập tin sửa đổi

sửa đổi: bạn/mâu thuẫn/file

git rebase --continue sẽ làm việc tốt trong tình huống này.

Đôi khi, tuy nhiên, khi giải quyết xung đột, bạn xóa mọi thứ trong bản vá mới của mình, chỉ giữ mã từ nhánh bạn đã khởi động lại. Bây giờ khi bạn thêm tệp, tệp sẽ chính xác như tệp bạn đã cố gắng rebase. Trạng thái git sẽ hiển thị không có dòng màu xanh lá cây hiển thị các tệp đã sửa đổi. Bây giờ, nếu bạn

git rebase --continue 

git sẽ phàn nàn với

Không có thay đổi - cậu quên sử dụng 'git add'?

git Điều gì thực sự muốn bạn làm gì trong tình huống này là sử dụng

git rebase --skip 

để bỏ qua các bản vá. Trước đây tôi chưa bao giờ làm điều này, vì tôi đã luôn luôn không chắc chắn những gì thực sự sẽ bị bỏ qua nếu tôi đã làm, nó không rõ ràng với tôi những gì "bỏ qua miếng vá này" thực sự có nghĩa là. Nhưng nếu bạn không nhận được đường màu xanh với

sửa đổi: bạn/mâu thuẫn/file

sau khi chỉnh sửa các tập tin mâu thuẫn, thêm nó, và làm tình trạng git, sau đó bạn có thể khá chắc chắn rằng bạn loại bỏ các toàn bộ bản vá và thay vào đó bạn có thể sử dụng

git rebase --skip 

để tiếp tục.

Các bài ban đầu cho biết điều này đôi khi hoạt động:

git add -A 
git rebase --continue 
# works magically? 

... nhưng không dựa vào điều này (và chắc chắn không để thêm các tập tin còn sót lại trong các thư mục kho lưu trữ của bạn)

+0

Tôi dường như có cùng một vấn đề và giải pháp tương tự, cũng có vẻ huyền diệu! –

+0

Tôi gặp vấn đề tương tự, có vẻ như bạn đã cấu trúc lại trong nhánh đã được rebased và thêm các tập tin mới, và sau đó quá trình giải quyết hợp nhất đã thay đổi các tệp mới đó, bạn cần phải thêm git một cách rõ ràng. – Ibrahim

+0

Không làm điều này trừ khi bạn muốn theo dõi tất cả các tập tin rác để repo của bạn. –

1

Sau khi khắc phục xung đột, hãy đảm bảo các tệp đã thay đổi được thêm vào tệp được dàn dựng của bạn. Điều này giải quyết các vấn đề đối với tôi.

Các vấn đề liên quan