Làm cách nào để giữ tệp cục bộ hoặc tệp từ xa trong khi hợp nhất bằng Git và dòng lệnh?


194

Tôi biết cách hợp nhất sửa đổi bằng vimdiff, nhưng, giả sử tôi chỉ biết rằng toàn bộ tệp là tốt để giữ hoặc vứt đi, tôi phải làm thế nào?

Tôi không muốn mở vimdiff cho mỗi người trong số họ, tôi thay đổi muốn có một lệnh 'giữ địa phương' hoặc 'giữ từ xa'.

EG: Tôi đã hợp nhất với các tệp được đánh dấu là đã thay đổi vì ai đó đã mở nó dưới cửa sổ, thay đổi EOL và sau đó được cam kết. Khi hợp nhất, tôi muốn chỉ giữ phiên bản của riêng mình và loại bỏ phiên bản của mình.

Tôi cũng quan tâm ngược lại: Tôi đã làm hỏng thời gian lớn và muốn chấp nhận tệp từ xa, loại bỏ các thay đổi của tôi.

Câu trả lời:


308

Bạn cũng có thể làm:

git checkout --theirs /path/to/file

để giữ tệp từ xa và:

git checkout --ours /path/to/file

để giữ tập tin cục bộ.

Sau đó, git addhọ và mọi thứ đã được thực hiện.

Phiên bản: Hãy nhớ rằng đây là một mergekịch bản. Trong một rebase --theirsđề cập đến chi nhánh nơi bạn đã làm việc.


4
Tôi đã làm điều này .. nhưng không có gì xảy ra .. làm thế nào để tôi biết nó đang lấy đúng tập tin? Tôi đang sử dụng git version 1.8.4nếu điều đó quan trọng.
Rosdi Kasim

3
Tại sao từ ngược lại sử dụng? Tôi giả sử "của họ" sẽ là tập tin từ xa và "của chúng tôi" sẽ là tập tin của tôi
phuclv

1
Vậy là xong, @ LưuV TừPhúc
Đang chờ Dev ...

7
không, ý nghĩa của chúng là stackoverflow.com/q/2959443/995714 stackoverflow.com/q/29324812/995714 của chúng sẽ là các tệp của tôi và của chúng tôi là các tệp trong nhánh từ xa
phuclv

6
"Dễ", vâng. Trực giác? Số
Wilbur Whateley

107

Cách tiếp cận này có vẻ đơn giản hơn, tránh việc phải chọn riêng từng tệp:

# keep remote files
git merge --strategy-option theirs
# keep local files
git merge --strategy-option ours

hoặc là

# keep remote files
git pull -Xtheirs
# keep local files
git pull -Xours

Sao chép trực tiếp từ: Giải quyết xung đột hợp nhất Git có lợi cho những thay đổi của chúng trong quá trình kéo


3
Thích cái này. Đặc biệt nếu có nhiều hơn một tập tin.
Tek

Câu hỏi dành cho hai lệnh khác nhau, nhưng không có mô tả nào về hai lệnh này làm gì. Mỗi dòng làm gì?
Alex

Tôi đã trải qua ít nhất năm câu trả lời stackoverflow trước khi tìm thấy điều này, đó là điều tôi muốn. Cảm ơn.
Bolton Bailey

14

git checkout {branch-name} -- {file-name}

Điều này sẽ sử dụng các tập tin từ chi nhánh của sự lựa chọn.

Tôi thích điều này bởi vì posh-gittự động hoàn thành công việc tuyệt vời với điều này. Nó cũng loại bỏ bất kỳ sự mơ hồ nào về việc nhánh nào ở xa và nhánh nào. Và --theirsdù sao cũng không làm việc cho tôi.


Không có sự mơ hồ, hoạt động cho cả {mine} và {thems}, hỗ trợ thêm toàn bộ thư mục. Đây phải là câu trả lời được chấp nhận.
dotancohen

9

Đối với điều cuối dòng, tham khảo man git-merge:

--ignore-space-change 
--ignore-all-space 
--ignore-space-at-eol

Đảm bảo thêm autocrlf = falsevà / hoặc safecrlf = falsevào bản sao windows (.git / config)

Sử dụng git mergetool

Nếu bạn định cấu hình một mergetool như thế này:

git config mergetool.cp.cmd '/bin/cp -v "$REMOTE" "$MERGED"'
git config mergetool.cp.trustExitCode true

Sau đó, đơn giản

git mergetool --tool=cp
git mergetool --tool=cp -- paths/to/files.txt
git mergetool --tool=cp -y -- paths/to/files.txt # without prompting

Sẽ làm việc

Sử dụng các lệnh git đơn giản

Trong các trường hợp khác, tôi giả sử

git checkout HEAD -- path/to/myfile.txt

nên làm mánh khóe

Chỉnh sửa để làm ngược lại (vì bạn đã làm hỏng):

git checkout remote/branch_to_merge -- path/to/myfile.txt

+1 cho các mẹo, nhưng không được chấp nhận nhưng vì đó không phải là điều tôi yêu cầu. Tôi muốn một cái gì đó hoạt động trong tất cả các trường hợp, không chỉ trong các trường hợp ví dụ. Cộng với "git checkout remote / Branch_to_merge - path / to / myfile.txt" sẽ không hoạt động nếu bạn đã bắt đầu hợp nhất của mình: nó sẽ nói rằng bạn đang ở giữa một sự hợp nhất và sẽ ngăn bạn làm như vậy.
e-satis

1
@ e-satis: thật đáng ngạc nhiên. Tôi sẽ xem xét rằng đó là một lỗi, vì thanh toán với một đường dẫn không phải là thanh toán thông thường (và nó không ảnh hưởng đến CHÍNH). Tôi sẽ dùng thử ngay bây giờ vì tôi không thể tin được
sehe

1
@ e-satis: Soooo ... Tôi đã đúng; git checkout remote/branch_to_merge -- path/to/myfile.txthoạt động như một lá bùa trong khi giải quyết xung đột hợp nhất. (git 1.7.1)
sehe

1
Đã thêm một giải pháp dựa trên git mergetool ngay bây giờ
sehe
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.