2013-01-06 23 views
12

Giả sử rằng tôi nhận được một cuộc xung đột nhập vào foo/bar.txt khi chạy này:Cách tự động giải quyết xung đột Git bằng cách lấy phiên bản trong nhánh hiện tại?

$ git checkout A 
$ git merge B 

tôi muốn tự động giải quyết mâu thuẫn bằng cách lấy foo/bar.txt từ chi nhánh A. (Tôi biết những gì tôi đang làm, và tôi . không cần này phiên bản tại chi nhánh B là sai, và tôi không quan tâm về việc mất những thay đổi trong cây làm việc trong trường hợp này) dường như tôi có thể làm điều đó bằng cách chạy các lệnh này:.

$ git reset foo/bar.txt 
$ git checkout foo/bar.txt 

is có một giải pháp đơn giản, đơn giản hơn?

Thật không may, các lệnh này thay đổi foo/bar.txt ngay cả khi không có xung đột và tôi không muốn điều đó. Nếu không có xung đột, tôi muốn giữ foo/bar.txt ở trạng thái bất kỳ git merge B đã để lại.

Vì vậy, tôi cần một lệnh shell Unix, sẽ phát hiện nếu có xung đột trong foo/bar.txt và nếu có, nó sẽ giải quyết xung đột bằng cách lấy phiên bản foo/bar.txt từ nhánh hiện tại. Nó sẽ không làm bất cứ điều gì khác, tức là nó sẽ không sửa đổi các tập tin khác, nó sẽ không cam kết những thay đổi, và nó sẽ không thay đổi foo/bar.txt nếu không có xung đột trong tập tin đó.

+0

Từ xa: http://stackoverflow.com/questions/528659/git-automatic-conflict-resolution –

Trả lời

10

Nếu bạn muốn làm điều đó như một one-off, lệnh đơn dòng là:

$ git checkout --ours foo/bar.txt # <-- resets it only if the merge found conflicts in this file 
$ git checkout HEAD -- foo/bar.txt # <-- resets it to that specific version no matter what 

Để cấu hình hợp nhất git tạm thời bỏ qua tất cả những thay đổi ở thượng nguồn vào một tập tin địa phương thay đổi:

$ git config merge.pin.driver true 
$ echo foo/bar.txt merge=pin >> .git/info/attributes 

(true trên chỉ là lệnh unix true, thành công của nó nói nó làm cho các phiên bản địa phương nhìn bên phải, trong trường hợp này bằng cách không làm gì với nó. Bạn tất nhiên có thể phức tạp hơn với các lệnh hợp nhất của bạn.)

Tôi nghĩ bạn không muốn merge --strategy=ours hoặc --strategy-option=ours, những điều đó áp dụng cho toàn bộ các lần hợp nhất.

+0

Cảm ơn bạn (+1) cho câu trả lời thông tin, tôi đã học được rất nhiều về Git từ nó. – pts

6

Bạn có thể chỉ định tùy chọn chiến lược hợp nhất ours cho chiến lược hợp nhất recursive (mặc định). Nó sẽ làm một sự hợp nhất bình thường, nhưng trong trường hợp các xung đột sẽ chọn phiên bản của nhánh hiện tại.

git checkout A 
git merge -Xours B 
+0

Cảm ơn bạn đã cung cấp thông tin bổ sung này. Thật không may nó không trả lời câu hỏi của tôi, vì lệnh 'git merge B' (và có thể nhiều thay đổi hệ thống tập tin không được cam kết khác) đã được chạy. – pts

+0

Nếu bạn đã chạy lệnh hợp nhất, thì bạn phải sử dụng phương thức 'reset && checkout'. – knittl

+0

Phương pháp đặt lại + thanh toán không phải là câu trả lời cho câu hỏi của tôi, bởi vì nó không phải là không có op nếu không có xung đột (xem câu hỏi để biết chi tiết). – pts

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