Làm cách nào để khắc phục xung đột hợp nhất do xóa tệp trong nhánh?


207

Tôi đã tạo một dialognhánh và khi tôi cố gắng hợp nhất nó với masternhánh. Có 2 mâu thuẫn. Tôi không biết làm thế nào để giải quyết CONFLICT (delete/modify). Bạn có thể vui lòng cho tôi biết phải làm gì?

$ git checkout master
$ git merge dialog
CONFLICT (delete/modify): res/layout/dialog_item.xml deleted in dialog and modified in HEAD. Version HEAD of res/layout/dialog_item.xml left in tree.
Auto-merging src/com/DialogAdapter.java
CONFLICT (content): Merge conflict in src/DialogAdapter.java
Automatic merge failed; fix conflicts and then commit the result.

Tôi đã mở src/DialogAdapter.java, sửa lỗi xung đột và đã làm a git add src/DialogAdapter.java. Tôi cần làm gì khác?


Bạn có thể đọc bài đăng này trên Stack Overflow: - Làm cách nào để khắc phục xung đột trong Git? Câu trả lời được chấp nhận tham khảo hướng dẫn sử dụng git .
heavyyd

Câu trả lời:


270

Thông điệp xung đột:

CONFLICT (xóa / sửa đổi): res / layout / hộp_item.xml đã bị xóa trong hộp thoại và được sửa đổi trong HEAD

có nghĩa là res/layout/dialog_item.xmlđã bị xóa trong nhánh 'hộp thoại' mà bạn đang hợp nhất, nhưng đã được sửa đổi trong CHÍNH (trong nhánh bạn đang hợp nhất).

Vì vậy, bạn phải quyết định xem

  • xóa tệp bằng " git rm res/layout/dialog_item.xml"

hoặc là

  • chấp nhận phiên bản từ HEAD (có lẽ sau khi chỉnh sửa) với " git add res/layout/dialog_item.xml"

Sau đó, bạn hoàn thành hợp nhất với " git commit".

Lưu ý rằng git sẽ cảnh báo bạn rằng bạn đang tạo một cam kết hợp nhất, trong trường hợp (hiếm), đó là điều bạn không muốn. Có lẽ vẫn còn từ những ngày mà trường hợp nói là hiếm hơn.


21
Đã thử trước đây ( git rm …) nhưng tôi nhận được …: needs mergerm '…'tôi đang gặp khó khăn trong việc diễn giải. Và sau đó nếu tôi cố gắng cam kết, stackoverflow.com/questions/19985906/ sẽ xuất hiện trở lại.
Jesse Glick

17
Đừng bận tâm đến nửa sau của bình luận đó. Đầu ra từ Git có phần đáng báo động nhưng dường như vô hại.
Jesse Glick

4
Có một cách tiếp cận đại chúng? Tôi có một dự án trong tay dựa vào những thứ bên ngoài mà tôi không muốn giữ. Vì vậy, có rất nhiều tệp đã được sửa đổi ngược dòng và tôi muốn xóa trong nhánh của mình rằng tôi đang nổi loạn không có vấn đề gì. Thật là tẻ nhạt để làm điều đó từng cái một.
mlt

2
@mit: bạn có thể sử dụng git ls-files --stagevà / hoặc git status --porcelain/ hoặc git diff-files <something>để lấy danh sách các tệp đã thay đổi và điều khiển một tập lệnh để xóa chúng hoặc chấp nhận phiên bản của bạn.
Jakub Narębski

1
@Honey: Thông báo CONFLICT bao gồm mô tả về thay đổi nào thuộc về chi nhánh. Bạn có thể kiểm tra nó sau với git statushoặc git diff --cc. Ngoài ra còn git log --mergecó thể giúp ...
Jakub Narębski

74

Tôi thường chỉ chạy git mergetoolvà nó sẽ nhắc tôi nếu tôi muốn giữ tệp đã sửa đổi hoặc giữ nó bị xóa. Đây là cách nhanh nhất IMHO vì đây là một lệnh thay vì nhiều lệnh cho mỗi tệp.

Nếu bạn có một loạt các tệp bị xóa trong một thư mục con cụ thể và bạn muốn tất cả chúng được giải quyết bằng cách xóa các tệp, bạn có thể làm điều này:

yes d | git mergetool -- the/subdirectory

Các dđược cung cấp để lựa chọn xóa từng tập tin. Bạn cũng có thể sử dụng mđể giữ các tập tin sửa đổi. Lấy từ lời nhắc bạn nhìn thấy khi bạn chạy mergetool:

Use (m)odified or (d)eleted file, or (a)bort?

1
@BrianMinton tôi cũng vậy, những thứ khác chỉ là một vòng luẩn quẩn
Nate L

2
Điều này gây khó chịu khi nhiều tệp của nó, có cách nào để đưa ra một câu trả lời cho tất cả không?
ideaman42

2
@ ideaman42 Tôi đã cập nhật câu trả lời của mình để hiển thị giải pháp xóa hàng loạt.
void.pulum

1
Tôi thực sự không biết về công cụ hợp nhất. Bạn đã cứu anh chàng ngày của tôi!
Mert

6

Nếu bạn đang sử dụng Git Gui trên windows,

  1. Hủy bỏ hợp nhất
  2. Hãy chắc chắn rằng bạn đang ở trong nhánh mục tiêu của mình
  3. Xóa tệp xung đột khỏi explorer
  4. Quét lại các thay đổi trong Git Gui (F5)
  5. Lưu ý rằng tập tin xung đột sẽ bị xóa
  6. Chọn tập tin thay đổi giai đoạn để cam kết (Ctrl-I) từ menu Cam kết
  7. Nhập một bình luận cam kết như "xóa tệp xung đột"
  8. Cam kết (ctrl-enter)
  9. Bây giờ nếu bạn khởi động lại hợp nhất, nó sẽ (hy vọng) hoạt động.

5
Có lẽ anh chàng không thích cách bạn xử lý Git bằng GUI. Một cách dòng lệnh là tốt hơn.
Souris
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.