Làm thế nào để hoàn tác hợp nhất git với xung đột


785

Tôi đang ở chi nhánh mybranch1. mybranch2được rẽ nhánh mybranch1và thay đổi được thực hiện trong mybranch2.

Sau đó, trong khi mybranch1, tôi đã thực hiện git merge --no-commit mybranch2 Nó cho thấy có những xung đột trong khi hợp nhất.

Bây giờ tôi muốn loại bỏ tất cả mọi thứ ( mergelệnh) để mybranch1trở lại với những gì trước đây. Tôi không biết làm thế nào để tôi đi về điều này.


Câu trả lời:


1355

Git mới nhất:

git merge --abort

Điều này cố gắng đặt lại bản sao làm việc của bạn về bất kỳ trạng thái nào trước khi hợp nhất. Điều đó có nghĩa là nó sẽ khôi phục mọi thay đổi không được cam kết từ trước khi hợp nhất, mặc dù nó không thể luôn luôn làm như vậy một cách đáng tin cậy. Nói chung, bạn không nên hợp nhất với các thay đổi không được cam kết nào.

Trước phiên bản 1.7.4:

git reset --merge

Đây là cú pháp cũ hơn nhưng thực hiện giống như trên.

Trước phiên bản 1.6.2:

git reset --hard

trong đó loại bỏ tất cả các thay đổi không được cam kết, bao gồm cả hợp nhất không được cam kết. Đôi khi hành vi này hữu ích ngay cả trong các phiên bản Git mới hơn hỗ trợ các lệnh trên.


1
Nhưng đối với các phiên bản cũ hơn của git thì đây là cách sử dụng
Anshul

7
Đôi khi bạn vẫn cần sử dụng git reset --mergengay cả trong các phiên bản gần đây hơn. Tôi đã gặp git merge --abortlỗi (không thay đổi) khi git reset --mergethành công (và thực hiện đúng) trong git 2.2.1.
Theodore Murdock

Tôi thấy rằng tôi cần phải làm git merge --aborttheo sau git reset --mergekhi có xung đột tự động từ việc bật stash của tôi.
Đầu bếp Pharaoh

1
thường git merge --abortlàm việc cho tôi, tuy nhiên tôi thấy mình trong tình huống tôi đã kiểm tra ở trạng thái CHÍNH tách rời và một trong các tệp của tôi có trạng thái "cả hai được sửa đổi". Tôi muốn tất cả mọi thứ loại bỏ và lấy lại cho một chi nhánh, tôi phải git reset --hard, git merge --abortnói với tôi không có hợp nhất để hủy bỏ, (MERGE_HEAD mất tích).
yano 17/12/18

Đôi khi git merge --abortkhông thể đưa bạn trở lại trạng thái trước đó và trong trường hợp đó, "cú pháp cũ hơn" git reset --hardthực hiện thủ thuật.
Kevin Stewart

130

Trên thực tế, nó là cần lưu ý rằng git merge --abortchỉ tương đương với git reset --mergecho rằng MERGE_HEADhiện diện. Điều này có thể được đọc trong trợ giúp git cho lệnh hợp nhất.

git merge --abort # is equivalent to git reset --merge when MERGE_HEAD is present.

Sau khi hợp nhất thất bại, khi không có MERGE_HEAD, hợp nhất thất bại có thể được hoàn tác git reset --mergenhưng không nhất thiết phải có git merge --abort, vì vậy chúng không chỉ là cú pháp cũ và mới cho cùng một điều .

Cá nhân tôi thấy git reset --mergehữu ích hơn nhiều trong công việc hàng ngày.


2
Cảm ơn bạn, thông tin này rất hữu ích. Tôi đã có một sự hợp nhất bắt đầu với git stash applymột nhánh sai, và git merge --abortkhông làm gì cả (không MERGE_HEAD), trong khi git reset --mergethực hiện mánh khóe.
geomaster

4
Tôi đã thấy khoảng 10 người nói rằng đó git merge --abortlà lệnh mới git reset --mergevà tôi gặp vấn đề tương tự như @geomaster, đây là lời cảm ơn siêu hữu ích!
Tom

106

Giả sử bạn đang sử dụng git mới nhất,

git merge --abort

Ok, điều này không hoạt động với 1.7.0.7 :(. Phải sử dụng thiết lập lại - với nó
Anshul

5

Có hai điều bạn có thể làm trước tiên là hoàn tác hợp nhất bằng lệnh

git merge --abort

hoặc là

bạn có thể tạm thời đến trạng thái cam kết trước đó bằng lệnh

git checkout 0d1d7fc32 

0

Sourcetree

Nếu bạn không cam kết hợp nhất, thì chỉ cần nhấp đúp chuột vào chi nhánh khác (= thanh toán) và khi sourcetree hỏi bạn về việc loại bỏ tất cả các thay đổi thì đồng ý

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.