Khi áp dụng bản vá có cách nào để giải quyết xung đột không?


124

Tôi đang ở trên cửa sổ.

Vì nhiều lý do khác nhau, chúng tôi có nhiều phiên bản git của các nhánh svn khác nhau.

Nhiều lần tôi muốn khắc phục sự cố trong kho lưu trữ A, tạo một bản vá và áp dụng nó vào kho lưu trữ B. Điều này hoạt động tốt trừ khi có xung đột.

Khi khôi phục, tôi chỉ cần nhấp chuột phải vào thư mục và sử dụng tortioseGit và chọn tùy chọn giải quyết. Điều này mang lại một niềm vui tốt đẹp để tôi có thể vượt qua những xung đột của mình.

Có cách nào để thực hiện điều này với các khối bản vá bị từ chối không?

Đây là cách tiếp cận hiện tại của tôi để tạo / áp dụng các bản vá

git format-patch master --stdout > c:\\patch\\file.patch
git apply --reject --ignore-space-change --ignore-whitespace c:\\patch\\file.patch

3
Tôi thường làm điều đó bằng tay khi tất cả các tùy chọn vá thất bại ...
stdcall

Nếu hợp nhất không thành công, đó là do chương trình không thể tìm ra cách thực hiện hợp nhất một cách mơ hồ. Bạn sẽ nhận được một tệp với các bộ <<<<, ===, >>>> và bạn phải truy cập và giải quyết chúng bằng tay.
tacaswell

Vâng làm điều đó bằng tay là một pita thực sự khi bạn nói chuyện với vài 100 rej hunks.
Kenoyer130

Đó là khi bạn muốn sử dụng git mergetoolvà làm một 3-way merge với gui của sự lựa chọn của bạn (tôi từng phần để kdiff trên cửa sổ) ...
g19fanatic

Câu trả lời:


254

Để tạo bản vá của bạn, hãy làm như sau:

git format-patch --stdout first_commit^..last_commit > changes.patch

Bây giờ khi bạn đã sẵn sàng áp dụng các bản vá:

git am -3 < changes.patch

những -3sẽ làm một ba chiều kết hợp nếu có xung đột. Tại thời điểm này bạn có thể làm một git mergetoolnếu bạn muốn đi đến một gui hoặc chỉ bằng tay sáp nhập các tập tin sử dụng vim (tiêu chuẩn <<<<<<, ||||||, >>>>>>giải quyết xung đột).


3
Nó có thể hữu ích để thêm --ignore-whitespace --ignore-space-changevào git amquá. Tôi đã có những hợp nhất tầm thường mà không có nó.
angularsen

12
git apply -3 changes.patchdường như làm việc cho tôi là tốt
peterflynn

1
Mặc dù bản vá không được áp dụng rõ ràng, tôi vẫn nhận được từ "Không cần hợp nhất tệp" git mergetool. Thay vào đó, tôi phải tìm base commit mà bản vá ban đầu được sử dụng, áp dụng trên đó (may mắn là repo của tôi có cái này) và sau đó rebase.
jozxyqk 11/09/18

4
Tôi đang gặp vấn đề tương tự như @jozxyqk. Cả git am -3cũng không git apply -3thực sự sẽ thả đánh dấu cuộc xung đột vào các tập tin của tôi, mặc dù tôi nhận được tin nhắn như Applied patch to 'configure.ac' with conflicts.error: patch failed: .... Cái này đang bật git 2.17.1. Có lẽ khi một số tệp không thể được vá, git sẽ quay trở lại?
nh2 13/11/18

1
Tôi gặp vấn đề tương tự như @ nh2, bạn đã bao giờ tìm thấy vấn đề chưa?
Eridanis

12

Nếu bạn thường xuyên gặp phải cùng một tập hợp xung đột khi áp dụng các bản vá, khôi phục hoặc hợp nhất thì bạn có thể sử dụng chức năng git rerere (tái sử dụng độ phân giải đã ghi). Điều này cho phép bạn xác định trước cách giải quyết xung đột dựa trên cách bạn đã giải quyết chúng trong quá khứ. Xem http://git-scm.com/blog/2010/03/08/rerere.html để biết chi tiết về cách hoạt động của tính năng này.


5

TortoiseGit có một tính năng hợp nhất có thể mở các tệp vá.

Có một bức ảnh của nó ở đây .


Trên thực tế, tùy chọn hợp nhất có thể là những gì tôi đang tìm kiếm.
Kenoyer130

Có thật không? Tôi đã không sử dụng rùa trong một thời gian dài, nhưng trang liên kết có dòng chữ "TortoiseMerge có thể mở trực tiếp tệp vá Git, bạn xem lại và vá thành bản sao hoạt động.", Nên có vẻ như vậy!
ams

nó mở các tập tin vá lỗi ... tuy nhiên, đôi khi định dạng tập tin vá lỗi sẽ phá vỡ đồi mồi. tôi chưa bao giờ thành công với đầu ra diff -u, nhưng đúng hơn là diff -c.
thistleknot

Bạn cũng có thể kéo các bản vá lỗi sang phải trên một thư mục cây làm việc và chọn "Áp dụng nối tiếp bản vá" (đối với các bản vá lỗi như 0001-xxx.patch, ... 0002-xxy.patch) hoặc "Áp dụng tệp bản vá duy nhất".
MrTux

2

Cách tiếp cận của tôi là:

  • Tạo chi nhánh "Tích hợp" nơi các tệp giống hệt nhau
  • Áp dụng bản vá cho Integration-Branch này
  • Hợp nhất hoặc rebase nó thành master (không biết rebase có hữu ích ở đây không, vì tôi không biết điều gì sẽ xảy ra khi áp dụng các bản vá tiếp theo)
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.