Làm thế nào để khôi phục hai cam kết trước đó?


83

Hãy xem xét tình huống này:

  1. Nhà phát triển A thực hiện một cam kết: #n
  2. Nhà phát triển. B thực hiện cam kết # n + 1
  3. Nhà phát triển. A thực hiện cam kết # n + 2
  4. và cam kết # n + 3

và sau đó phát hiện ra rằng trong commit # n + 2, anh ấy đã đưa ra một khiếm khuyết.

Làm thế nào có thể dev. Khôi phục 2 cam kết cuối cùng của anh ấy và tiếp tục phát triển trên cam kết # n + 1 ?

Cố gắng git reset --hard HEAD~2* , nhưng nó trở lại dev của một cam kết #n .


2
git reset HEAD ~ 2 sẽ đặt lại thành # n + 1 commit nếu bạn đã kéo B commit tại thời điểm đó. Bạn đã kéo chúng?
Snowbear

1
... không phải trước # n + 2 commit. Đó là: [0] B đã đẩy commit# n + 1, [1] A đẩy commit# n + 2, [2] không thành công push, [3] pull, [4] push. Vì vậy, trên github bây giờ có một cam kết (# n + 2) và một nhánh Hợp nhất 'chủ' (# n + 3).
Marius Butuc,

2
Nếu bạn đã xuất bản cam kết, bạn không nên sử dụng đặt lại để khôi phục nó. (Nếu một số nhà phát triển khác không quan tâm đến bạn đã kéo, điều này sẽ gây đau đớn.) Thay vào đó, hãy sử dụng hoàn nguyên và thực hiện một cam kết mới đưa bạn đến trạng thái bạn muốn. Không bao giờ thay đổi lịch sử đã xuất bản. Xem book.git-scm.com/…
William Pursell

Câu trả lời:


122

Nó sẽ quay lại cam kết thứ n + 1. Bạn cũng có thể có một cam kết hợp nhất trong đó. Bạn cũng có thể làm mộtgit reset --hard <sha1_of_where_you_want_to_be>

CẢNH BÁO!! --hardcó nghĩa là mọi thay đổi chưa cam kết mà bạn hiện có sẽ bị loại bỏ vĩnh viễn.


2
Làm cách nào để lấy sha1 của một cam kết từ xa (không phải do tôi thực hiện)? Tôi đã cố gắng sử dụng git reflog, nhưng tôi chỉ có thể truy cập thông tin reflog địa phương ví dụ của tôi, cam kết sốN, # n + 2, # n + 3 ... nhưng không # n + 1
Marius Butuc

13
Tôi đã nhận được sha1 mà tôi muốn từ a git log, nhưng a git push -fcũng được yêu cầu, vì vậy các sửa đổi sẽ được phản ánh trên github.
Marius Butuc

1
Có, nhưng tôi không biết bạn muốn cập nhật một từ xa là tốt :)
Adam Dymitruk

25
CẢNH BÁO!! --hardcó nghĩa là mọi thay đổi chưa cam kết mà bạn hiện có sẽ bị loại bỏ vĩnh viễn. Để quay trở lại cam kết trước đó, hãy sử dụng --soft.
Ken M. Haggerty

4
Xin giải thích việc sử dụng --hard thay vì --soft
iuridiniz
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.