Git: làm thế nào để hợp nhất ngược một cam kết?


124

Với SVN, thật dễ dàng để hợp nhất ngược một cam kết, nhưng làm thế nào để làm điều đó với Git?



Tôi không nghĩ đây là ý nghĩa của câu hỏi. Hợp nhất ngược trong SVN cũng hoàn nguyên các thay đổi từ cam kết thành các thay đổi cục bộ, vì vậy bạn có thể chỉnh sửa chúng và cam kết lại.
túc xá

Câu trả lời:


105

Để tạo một cam kết mới 'hoàn tác' những thay đổi của một cam kết trước đây, hãy sử dụng:

$ git revert <commit>

Bạn cũng có thể thực sự xóa một cam kết từ một điểm tùy ý trong quá khứ bằng cách khôi phục và sau đó đặt lại, nhưng bạn thực sự không muốn làm điều đó nếu bạn đã đẩy cam kết của mình sang một kho lưu trữ khác (hoặc ai đó đã lấy từ bạn) .


31
Bạn có thể cần cung cấp -m <parent number>tùy chọn git revertđể chỉ định thay đổi nào cần hoàn nguyên. Nếu bạn muốn hoàn tác hợp nhất lịch sử chưa được xuất bản, hãy sử dụng git reset --hard HEAD^1.
Jakub Narębski

3
Jakub: điều đó đúng nếu bạn đang hoàn nguyên một cam kết hợp nhất, nhưng trong thuật ngữ Subversion, "hợp nhất ngược" thực sự chỉ là tên để hoàn nguyên bất kỳ loại cam kết nào.
Ben James

4
Xin lưu ý rằng việc sử dụng -mcó nghĩa là hợp nhất trong tương lai từ nhánh chưa hợp nhất sẽ không bao gồm các thay đổi so với trước đó hợp nhất! Xem schacon.github.com/git/howto/revert-a-faulty-merge.txt để biết các cách hợp nhất lại chi nhánh chưa được hợp nhất.
Martijn Pieters

125

Để trở lại một hợp nhất cam kết, bạn cần sử dụng: git revert -m <parent number>. Vì vậy, ví dụ: để hoàn nguyên cam kết hợp nhất gần đây nhất bằng cách sử dụng giá trị gốc với số 1, bạn sẽ sử dụng:

git revert -m 1 HEAD

Để hoàn nguyên một cam kết hợp nhất trước lần cam kết cuối cùng, bạn sẽ thực hiện:

git revert -m 1 HEAD^

Sử dụng git show <merge commit SHA1>để xem cha mẹ, đánh số là thứ tự họ xuất hiện, ví dụ:Merge: e4c54b3 4725ad2

tài liệu hợp nhất git: http://schacon.github.com/git/git-merge.html

thảo luận về git merge (khó hiểu nhưng rất chi tiết): http://schacon.github.com/git/howto/revert-a-faulty-merge.txt


36
Làm thế nào bạn có thể lấy 'số' được liên kết với cha mẹ? Các nhánh có 'id' bằng số nội tại không?
daniyalzade

7
Sử dụng git show <merge commit SHA1>để xem các bậc phụ huynh, việc đánh số là thứ tự chúng xuất hiện ví dụMerge: e4c54b3 4725ad2
supermethod

8
ví dụ: git revert -m 1 SHA1Lệnh đó làm việc để tôi hoàn nguyên một cam kết hợp nhất là một số cam kết hợp nhất trước phần đầu và có nhiều cam kết bên dưới.
c.apolzon 13/12/12

3
Đó là cha mẹ? E4c54b3 hoặc 4725ad2?
Dolphin

1
Điều này vẫn không cung cấp đủ thông tin về cách kết quả của git hiển thị liên quan đến số cha mẹ. Có phải "thứ tự xuất hiện" là dựa trên 1? Dựa trên 0? Cụ thể trong ví dụ này, SHA1 của phụ huynh 1 là gì? e4c54b3 hay 4725ad2?
cowlinator

4

Nếu tôi hiểu bạn đúng, bạn đang nói về việc

svn merge -rn:n-1

để rút lui khỏi một cam kết trước đó, trong trường hợp đó, có thể bạn đang tìm kiếm

git revert

0
git reset --hard HEAD^ 

Sử dụng lệnh trên để hoàn nguyên các thay đổi hợp nhất.


3
Điều này loại bỏ cam kết hợp nhất, điều này không thực hiện những gì người đăng ban đầu yêu cầu. OP đang cố gắng thực hiện một bản vá ngược để hoàn tác các thay đổi trước đó, chứ không phải xóa hoàn toàn lịch sử của các thay đổi trước đó.

-1

Nếu bạn không muốn cam kết hoặc muốn cam kết sau (thông báo cam kết sẽ vẫn được chuẩn bị cho bạn và bạn cũng có thể chỉnh sửa):

git revert -n <commit>
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.