2011-11-04 31 views
5

(Lưu ý, tôi không tìm kiếm câu trả lời git rebase -i)Làm cách nào để "mở lại" một cam kết git?

Trong lanh lợi, tôi có thể "mở lại" một cam kết bằng cách nhập nó vào hàng đợi bản vá của tôi:

hg qimport tip 

Các cam kết là "mở" theo nghĩa là nó giống như trước khi tôi đã cam kết, tôi có thể quay lại, làm hg diff, hg status, v.v. Làm cách nào để thực hiện điều này trong git?

(Tất cả những gì tôi đã tìm thấy trên web cho thấy git rebase -i và sau đó chọn chỉnh sửa, nhưng đó là khác nhau, vì cam kết không phải là "mở" trong cùng một cách.)

+0

Tùy chọn khác là để lại cam kết ở đó, thay đổi một số thứ khác, và sau đó sử dụng chúng để * sửa đổi * cam kết ('git commit --amend'). – Cascabel

Trả lời

16

Bạn chỉ cần di chuyển con trỏ HEAD lên mà không thực hiện bất kỳ thay đổi bản sao làm việc của bạn:

git reset --soft HEAD^ 

Đặt lại di chuyển con trỏ, và các tùy chọn phần mềm xác định rằng nó không nên thay đổi bất kỳ tập tin của bạn. Mặc định là hỗn hợp, sẽ thiết lập lại chỉ mục của bạn, và tùy chọn cứng sẽ thực sự loại bỏ các thay đổi kể từ khi cam kết đó trong bản sao làm việc của bạn.

HEAD là con trỏ git "ma thuật" luôn trỏ đến ref hiện tại (tức là cha mẹ của bản sao làm việc của bạn). Dấu mũ (^) biểu thị phụ huynh. Bạn có thể sử dụng liên tục này, ví dụ: HEAD^^ dùng để chỉ cha/mẹ của lần commit cuối cùng.

+0

Câu trả lời hay, cảm ơn! Bạn có thể ghi chú rằng bạn bị mất tin nhắn cam kết, như @wulong đã làm? –

+0

Nếu bạn thực sự muốn sử dụng nó nhiều lần, 'HEAD ^^^^^' giống với 'HEAD ~ 5'. (Và chính xác hơn, 'HEAD' là một biểu tượng ref, trỏ đến nhánh hiện đã được kiểm tra, trỏ tới cam kết hiện đã được kiểm tra, hoặc thẳng đến một cam kết nếu bạn đang ở trạng thái HEAD tách rời, không có nhánh nào được chọn .) – Cascabel

+3

@PaulBiggar: Tránh mất thông điệp cam kết là một lý do tuyệt vời để sửa đổi thay vì đặt lại. Nếu bạn đặt lại, bạn vẫn có thể phục hồi gián tiếp thông báo cam kết. 'HEAD @ {1}' đề cập đến cam kết đã kiểm tra trước đó, mà (nếu bạn chưa làm gì khác) sẽ là cam kết đặt lại trước. Bạn có thể sử dụng 'git commit -c HEAD @ {1}' để sử dụng thông điệp cam kết của nó như là một nơi bắt đầu. (Nếu bạn đã di chuyển HEAD từ lúc đó, bạn có thể sử dụng 'git reflog' để tìm commit ở xa hơn trong các reflog.) – Cascabel

2

Giả sử bạn chưa được đẩy tới kho lưu trữ từ xa của bạn, git reset --soft HEAD^ sẽ "mở lại" lần commit cuối cùng của bạn với chi phí mất thông điệp cam kết của bạn.

2

Bạn có thể đạt được kết quả tương tự bằng cách sử dụng git commit --amend.

Xem comparison chart giữa Hg & Git.

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