2010-02-23 29 views
562

cách đơn giản nhất để hoàn tác một đặc biệt cam kết rằng là là gì:Undo một đặc biệt cam kết trong Git đó là được đẩy lên Repos từ xa

  • không vào đầu hoặc HEAD
  • Đã được đẩy lên từ xa.

Bởi vì nếu nó không phải là cam kết mới nhất,

git reset HEAD 

không hoạt động. Và bởi vì nó đã được đẩy lên một từ xa,

git rebase -i 

git rebase --onto 

sẽ gây ra một số vấn đề trong điều khiển từ xa.

Hơn thế nữa, tôi không muốn sửa đổi lịch sử thực sự. Nếu có mã xấu, nó đã có trong lịch sử và có thể được nhìn thấy. Tôi chỉ muốn nó ra trong bản sao làm việc, và tôi không nhớ một cam kết hợp nhất ngược lại.

svn merge -r 303:295 http://svn.example.com/repos/calc/trunk 

mà loại bỏ tất cả thay đổi 295-302 bằng cách sáp nhập ngược lại tất cả những thay đổi về những sửa đổi, như một cam kết mới:

Nói cách khác, các Git tương đương với các lệnh svn Sau đây là những gì.

svn merge -c -302 ^/trunk 

để hủy bỏ các thay đổi từ cam kết tương ứng đó.

Tôi nghĩ rằng nó phải là một hoạt động khá đơn giản trong Git và một trường hợp sử dụng khá phổ biến. Điều gì khác là điểm của các cam kết nguyên tử?

Chúng tôi đã dàn dựng stashing và tất cả để đảm bảo các cam kết hoàn toàn nguyên tử, bạn không thể hoàn tác một hoặc nhiều cam kết nguyên tử một cách dễ dàng?

Trả lời

877

Xác định hàm băm của cam kết, sử dụng git log, sau đó sử dụng git revert <commit> để tạo một cam kết mới loại bỏ những thay đổi này. Theo cách này, git revert là cuộc trò chuyện của git cherry-pick - sau này áp dụng bản vá cho một chi nhánh thiếu nó, trước đây loại bỏ nó khỏi một chi nhánh có nó.

+174

Và sử dụng công tắc -n nếu bạn muốn mã trở lại, nhưng không tự động được cam kết lại – jaygooby

+9

Tùy chọn "m" sẽ làm gì? Tôi đã thử git revert 8213f7d nhưng thay vào đó là: error: Commit 8213f7dad1ed546b434a0d8a64cb783b530a5a30 là một tùy chọn hợp nhất nhưng không có -m được đưa ra. gây tử vong: hoàn nguyên không thành công – Malcolm

+1

'git help revert' nói rằng nó cho phép bạn chọn cha mẹ của hợp nhất bạn muốn quay trở lại. Bạn không thể hoàn nguyên hợp nhất mà không chọn cha mẹ. Tài liệu hướng dẫn bạn đến https://www.kernel.org/pub/software/scm/git/docs/howto/revert-a-faulty-merge.txt –

32

Vì nó đã được đẩy, bạn không nên thao tác trực tiếp lịch sử. git revert sẽ hoàn nguyên các thay đổi cụ thể từ cam kết sử dụng cam kết mới, để không thao tác lịch sử cam kết.

266

Tôi không thích tự động cam kết git revert, vì vậy điều này có thể hữu ích đối với một số người.

Nếu bạn chỉ muốn các tập tin sửa đổi không phải là tính năng tự động cam kết, bạn có thể sử dụng --no-commit

% git revert --no-commit <commit hash> 

mà là giống như -n

% git revert -n <commit hash> 
+6

Bạn cũng có thể thực hiện 'git reset HEAD ~ 1 --soft' nếu bạn đã hoàn nguyên mà không có' -n' – Daniel

+1

Nhưng 'git reset HEAD ~ n' sẽ không giải quyết được bất kỳ cam kết nào không thể liên lạc được từ Truy vấn là để hoàn nguyên bất kỳ cam kết cụ thể nào. – sangeethkumarp

Các vấn đề liên quan