Giải quyết xung đột hợp nhất 'cả hai được thêm vào trong git?


138

Tôi đang nổi loạn trong git và một xung đột tôi nhận được là 'cả hai được thêm vào' - nghĩa là, chính xác cùng một tên tệp đã được thêm độc lập trong nhánh của tôi và trong nhánh tôi đang nổi loạn. git statusnói với tôi:

# Unmerged paths:
#   (use "git reset HEAD <file>..." to unstage)
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
#       both added:         src/MyFile.cs

Câu hỏi của tôi là, làm thế nào để tôi giải quyết điều này? Tôi phải sử dụng một công cụ hợp nhất hoặc có cách nào tôi có thể làm điều đó chỉ từ dòng lệnh? Nếu tôi git rm src/MyFile.cs, làm thế nào để git biết phiên bản tệp nào tôi muốn xóa và tôi muốn giữ phiên bản nào?

Câu trả lời:


139

Nếu bạn sử dụng git rmgit sẽ xóa tất cả các phiên bản của đường dẫn đó khỏi chỉ mục để hành động giải quyết của bạn sẽ rời khỏi bạn mà không có phiên bản nào.

Bạn có thể sử dụng git checkout --ours src/MyFile.csđể chọn phiên bản từ nhánh mà bạn đang khởi động lại hoặc git checkout --theirs src/MyFile.cschọn phiên bản từ nhánh mà bạn đang khởi động lại.

Nếu bạn muốn kết hợp, bạn cần sử dụng công cụ hợp nhất hoặc chỉnh sửa thủ công.


1
Cảm ơn. Và tôi mới nhận ra rằng lý do công cụ hợp nhất không hoạt động là do git tạo các tệp .LOCAL và .REMOTE cho việc hợp nhất, nhưng không phải là tệp .BASE. Tôi nghĩ rằng nó chỉ nên tạo một tập tin .BASE trống. Nếu bạn tự tạo tệp .BASE trống, công cụ hợp nhất sẽ hoạt động tốt.
Jez


1
Vì vậy, bạn đang nói điều này sẽ được sửa trong một phiên bản gần đây của git?
Jez

1
@Jez: Đó là phiên bản git> = 1.7.9.1 git.kernel.org/?p=git/ mẹo
CB Bailey

21
Từ câu trả lời @Tom: Khi làm ... git checkout --ours someFile Có vẻ như nó không làm gì khi thực hiện trạng thái git. Chỉ cần nhớ để làm điều này sau đó. git add someFile git status
pec

72

Đôi khi tôi thấy khó hiểu khi sử dụng --theirs--ourscác tùy chọn để xác định tệp sẽ đến từ đâu. Hầu hết thời gian của tôi sẽ ở trong chi nhánh mà tôi đang nổi loạn được nhắc đến bởi --theirs!

Bạn cũng có thể dùng git checkout <tree-ish> -- src/MyFile.cs

Trường hợp <tree-ish>có thể được thay thế bằng tên nhánh hoặc id xác thực có chứa tệp bạn muốn giữ.

git checkout 6a363d8 -- src/MyFile.cs

git checkout my_branch -- src/MyFile.cs

git checkout HEAD -- src/MyFile.cs


42

Khi làm ...

git checkout --ours someFile

Có vẻ như nó không làm gì khi thực hiện trạng thái git.

Chỉ cần nhớ để làm điều này sau đó.

git add someFile
git status
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.