Git giải quyết xung đột bằng cách sử dụng --ours / - của họ cho tất cả các tệp


111

Có cách nào để giải quyết xung đột cho tất cả các tệp bằng checkout --ours--theirskhông? Tôi biết rằng bạn có thể làm điều đó cho các tệp riêng lẻ nhưng không thể tìm ra cách làm điều đó cho tất cả.


7
git checkout --ours -- .hiệu quả không? Nghĩa .là thư mục hiện tại, khi được áp dụng từ thư mục gốc, vì vậy về cơ bản nó có nghĩa là toàn bộ thư mục làm việc. Tuy nhiên, không chắc liệu điều đó có hoạt động với --ourscờ hay không và tôi không chắc nó sẽ xử lý các xung đột tệp đã xóa hoặc đổi tên như thế nào.

@Cupcake Tôi đã sử dụng thành công. Có lẽ đó phải là một câu trả lời?
Pedro Gimeno

Câu trả lời:


90

Chỉ cần grep qua thư mục làm việc và gửi kết quả thông qua lệnh xargs:

grep -lr '<<<<<<<' . | xargs git checkout --ours

hoặc là

grep -lr '<<<<<<<' . | xargs git checkout --theirs

Cách thức hoạt động: grepsẽ tìm kiếm qua mọi tệp trong thư mục hiện tại (the .) và thư mục con một cách đệ quy ( -rcờ) tìm kiếm các điểm đánh dấu xung đột (chuỗi '<<<<<<<')

các -lhoặc --files-with-matchescờ gây grep để đầu ra chỉ tên tập tin nơi chuỗi đã được tìm thấy. Quá trình quét dừng lại sau lần so khớp đầu tiên, vì vậy mỗi tệp phù hợp chỉ được xuất một lần.

Các tên tập tin kết hợp này sau đó được cấp nước tập trung để xargs , một tiện ích mà phá vỡ lên đường ống input stream vào lập luận cá nhân cho git checkout --ourshay--theirs

Xem thêm tại liên kết này .

Vì sẽ rất bất tiện khi phải nhập điều này mỗi lần trong dòng lệnh, nếu bạn thấy mình sử dụng nó nhiều, có thể là một ý tưởng không tồi khi tạo một bí danh cho shell bạn chọn: Bash là cách thông thường .

Phương pháp này phải hoạt động qua ít nhất phiên bản Git 2.4.x


14
Thay vì bôi trơn, tôi nghĩ nó cũng có thể sử dụng git diff --name-only --diff-filter=U.
Thái

10
Ngoài ra git status | grep both | awk '{print $3}' | xargs git checkout --[theirs|ours]. Nhanh hơn grepping nếu bạn có một dự án lớn.
joshbodily

1
@joshbodily Đẹp quá. Tôi không có dự án quá lớn đến nỗi tôi sẽ nhận thấy một sự khác biệt, nhưng tôi có thể xem làm thế nào nó sẽ được nhanh hơn nhiều đặc biệt là nếu vài tác phẩm đã thay đổi so với tổng số trong danh bạ ---- mà nên là trường hợp cho bình thường cam kết.
Dmitri

1
Lưu ý rằng điều này không làm việc cho các cuộc xung đột đổi tên / đổi tên, ví dụ:CONFLICT (rename/rename): Rename "a.txt"->"c.txt" in branch "HEAD" rename "a.txt"->"b.txt" in "master"
Borek Bernard

1
Tuy nhiên, một lựa chọn: git status --porcelain | egrep '^UU' | cut -d ' ' -f 2 |xargs git checkout --[theirs|ours].
Zitrax

52

Bạn có thể -Xourshoặc -Xtheirsvới git merge. Vì thế:

  1. hủy hợp nhất hiện tại (ví dụ: với git reset --hard HEAD)
  2. hợp nhất bằng cách sử dụng chiến lược bạn thích ( git merge -Xourshoặc git merge -Xtheirs)

TUYÊN BỐ TỪ CHỐI: tất nhiên bạn chỉ có thể chọn một tùy chọn, hoặc -Xourshoặc -Xtheirs, sử dụng chiến lược khác, tất nhiên bạn nên đi từng tệp.

Tôi không biết liệu có cách nào hay không checkout, nhưng tôi không thực sự nghĩ rằng nó cực kỳ hữu ích: chọn chiến lược bằng lệnh kiểm tra sẽ hữu ích nếu bạn muốn các giải pháp khác nhau cho các tệp khác nhau, nếu không thì chỉ cần tiếp cận chiến lược hợp nhất.


Cảm ơn, không biết họ có '--ours' và '- của họ' để hợp nhất. Có vẻ như để hợp nhất chúng thực sự không phải là một phần của chiến lược '-s' mà là một phần của các tùy chọn đệ quy '-X'. Phiên bản '-s' của chúng tôi thực sự chỉ thay thế tất cả các tệp mà không hợp nhất và chúng không tồn tại.
exe163,

Không có --theirshoặc --ours-Option cho git v1.9.4. Một cách tiếp cận sẽ là git merge -s recursive -Xtheirs BRANCH.
fbmd

--theirs--ourskhông có sẵn với git 2.2.0. Hoặc câu trả lời của tôi không chính xác hoặc chúng có sẵn trong phiên bản git cũ hơn (câu trả lời này khá cũ trong kỷ nguyên CNTT). Cách tiếp cận đúng là với -X. Tôi cập nhật cho phù hợp
ThanksForAllTheFish

Tính đến Version 2.4.0 --ours và --theirs vẫn còn rất nhiều sẵn git-scm.com/docs/git-checkout
Dmitri

Đã thử điều này và nhận được "hợp nhất tự động không thành công, khắc phục xung đột". Lệnh này rõ ràng không hoạt động như dự định và tôi khuyên bạn nên tránh nó - quá lỗi.
Adam

37

git checkout --[ours/theirs] .sẽ làm những gì bạn muốn, miễn là bạn là gốc rễ của mọi xung đột. của chúng tôi / của họ chỉ ảnh hưởng đến các tệp không hợp nhất, do đó bạn không cần phải đặc biệt xung đột grep / find / etc.


5
Đối với tôi, điều này dường như không tái diễn vào các thư mục con.
Daniel Baughman

5
Tôi hiểu error: path 'foo/bar/blah' does not have our version.
Robin Green

Tôi đang sử dụng git phiên bản 2.16.2.windows.1 và nó hoạt động hoàn hảo đối với tôi. Cảm ơn!
Pankwood

30
git diff --name-only --diff-filter=U | xargs git checkout --theirs

Có vẻ để làm công việc. Lưu ý rằng bạn phải được cd'ed vào thư mục gốc của git repo để đạt được điều này.


3
Tôi nghĩ đây là một câu trả lời hay hơn câu trả lời được bình chọn nhiều nhất bởi vì (1) nó áp dụng cho tất cả các tệp, không chỉ cho thư mục làm việc; và (2) nó sẽ không có bất kỳ độ giòn nào xung quanh việc trộn mỡ cho các điểm đánh dấu xung đột. Lệnh 'git diff' ở đây liệt kê tất cả các đường dẫn chưa được hợp nhất, đó chính xác là những gì chúng ta muốn kiểm tra.
bchurchill

Đẹp! Tôi luôn lo lắng về độ tin cậy của các điểm đánh dấu xung đột
00-BBB


2
function gitcheckoutall() {
    git diff --name-only --diff-filter=U | sed 's/^/"/;s/$/"/' | xargs git checkout --$1
}

Tôi đã thêm chức năng này trong tệp .zshrc .

Sử dụng chúng theo cách này: gitcheckoutall theirshoặcgitcheckoutall ours

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.