Có cách nào để giải quyết xung đột cho tất cả các tệp bằng checkout --ours
và --theirs
khô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ả.
Có cách nào để giải quyết xung đột cho tất cả các tệp bằng checkout --ours
và --theirs
khô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ả.
Câu trả lời:
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: grep
sẽ 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 ( -r
cờ) tìm kiếm các điểm đánh dấu xung đột (chuỗi '<<<<<<<')
các -l
hoặc --files-with-matches
cờ 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 --ours
hay--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
git diff --name-only --diff-filter=U
.
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.
CONFLICT (rename/rename): Rename "a.txt"->"c.txt" in branch "HEAD" rename "a.txt"->"b.txt" in "master"
git status --porcelain | egrep '^UU' | cut -d ' ' -f 2 |xargs git checkout --[theirs|ours]
.
Bạn có thể -Xours
hoặc -Xtheirs
với git merge
. Vì thế:
git reset --hard HEAD
)git merge -Xours
hoặ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 -Xours
hoặ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.
--theirs
hoặc --ours
-Option cho git v1.9.4. Một cách tiếp cận sẽ là git merge -s recursive -Xtheirs BRANCH
.
--theirs
và --ours
khô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
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.
error: path 'foo/bar/blah' does not have our version
.
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.
Trong trường hợp bất kỳ ai khác muốn ghi đè mọi thứ từ một nhánh (giả sử chính) bằng nội dung của nhánh khác, có một cách dễ dàng hơn:
git merge origin/master --strategy=ours
Cảm ơn https://stackoverflow.com/a/1295232/560114
Hoặc ngược lại, hãy xem Có phiên bản "của họ" của "git merge -s our" không?
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--ours
cờ 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.