Tôi đã làm điều tương tự ngày hôm nay, và thực hiện một cách tiếp cận khác (sau khi thử và sai) để quay lại trạng thái ngay trước khi stashing để tôi có thể tiếp tục giải quyết xung đột và hoàn thành hợp nhất.
Trước tiên, sau khi unstashing hợp nhất một phần trong nhánh đích, tôi đã chụp một danh sách các tệp có xung đột còn lại (tệp văn bản hoặc tab trình chỉnh sửa). Đây chỉ là danh sách các tập tin chưa được lưu trữ sau khi unstashing, vì các tập tin có xung đột đã được giải quyết sẽ được tổ chức trước khi stashing.
$ git status
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: myproject/src/main/java/com/acme/package3/Class3.java
# modified: myproject/src/main/java/com/acme/package3/Class4.java
#
Tiếp theo, tôi đã tạo ra một bản vá và thiết lập lại các chi nhánh trở về trạng thái trước khi hợp nhất:
$ git diff HEAD > ~/merge-with-resolved-conflicts.patch
$ git reset --hard HEAD
Sau đó, tôi đã tạo ra một chi nhánh tạm thời (có nguồn gốc từ các chi nhánh địa điểm hợp nhất), và áp dụng các miếng vá:
$ git checkout -b my-temp-branch
$ git apply ~/merge-with-resolved-conflicts.patch
$ git commit -a -m "Merge with resolved conflicts"
Vì vậy, HEAD của nhánh tạm thời chứa tất cả mọi thứ đã được giải quyết và các tệp có xung đột còn lại.
Sau đó, tôi chuyển trở lại chi nhánh gốc, sáp nhập một lần nữa, và nhìn vào tình trạng git
$ git checkout my-branch
$ git merge other-branch
$ git status
Các trạng thái hiển thị danh sách đầy đủ các tập tin với các cuộc xung đột:
# Unmerged paths:
# (use "git add <file>..." to mark resolution)
#
# both modified: myproject/src/main/java/com/acme/package1/Class1.java
# both modified: myproject/src/main/java/com/acme/package2/Class2.java
# both modified: myproject/src/main/java/com/acme/package3/Class3.java
# both modified: myproject/src/main/java/com/acme/package3/Class4.java
#
Bây giờ tôi cần thiết để so sánh hai danh sách tệp này. Bất kỳ tệp nào trong danh sách thứ hai nhưng không phải là tệp đầu tiên đã được giải quyết (trong ví dụ này, Class1.java và Class2.java). Vì vậy, đối với mỗi các tập tin, tôi kéo trong phiên bản với các cuộc xung đột được giải quyết từ các chi nhánh tạm thời (như cherry-pick, nhưng đối với những file riêng biệt chứ không phải là toàn bộ một cam kết):
$ git checkout my-temp-branch myproject/src/main/java/com/acme/package1/Class1.java
$ git checkout my-temp-branch myproject/src/main/java/com/acme/package2/Class2.java
Sau khi làm điều này, tôi đã trở lại cho nhà nước trước khi stash, vì vậy tôi có thể tiếp tục giải quyết các xung đột còn lại và cam kết hợp nhất.
Bạn có thực sự làm điều gì quan trọng không? (Bạn có thực sự cần phải khôi phục các thay đổi đã lưu trữ không?) Bạn có thể chỉ cần đặt lại hợp nhất đã cố gắng và thực hiện lại không? – Cascabel
Có và không, tương ứng. Các thay đổi bao gồm nhiều hơn một ngày giải quyết xung đột hợp nhất. – bukzor
@bukzor: Nếu bạn cần nhiều hơn thì một ngày để giải quyết xung đột hợp nhất có thể là lúc phải suy nghĩ lại chính sách của bạn về xử lý chi nhánh và phân phối công việc (hoặc tần suất hợp nhất). Độ phân giải hợp nhất dài như vậy là sau một nguồn tốt đẹp của khó tìm lỗi do số lượng thay đổi được thực hiện trong một cam kết – Grizzly