Tạm thời chuyển bản sao làm việc sang một cam kết Git cụ thể


248

Làm thế nào để chuyển sang cam kết Git cụ thể mà không mất tất cả các cam kết được thực hiện sau đó ?

Tôi muốn các tệp cục bộ sẽ được thay đổi, nhưng cơ sở dữ liệu của cam kết sẽ vẫn còn nguyên, chỉ con trỏ vị trí hiện tại được đặt thành cam kết hiện được chọn.

Tôi muốn thay đổi trạng thái của tệp thành cam kết cụ thể, chạy dự án và khi hoàn tất, khôi phục tệp trở lại cam kết cuối cùng.

Làm thế nào để làm điều này mà không nén toàn bộ thư mục của dự án?


Câu trả lời:


344

Nếu bạn đang ở một chi nhánh nhất định mybranch, chỉ cần đi trước và git checkout commit_hash. Sau đó, bạn có thể trở lại chi nhánh của bạn bằng cách git checkout mybranch. Tôi đã có cùng một trò chơi chia đôi một lỗi ngày hôm nay :) Ngoài ra, bạn nên biết về git bisect .


6
Lưu ý bạn chỉ có thể làm git checkout commit_hashnếu bạn đang ở trong một kho lưu trữ sạch và không cần phải phân nhánh. Có thể dễ dàng hơn cho một số trường hợp sử dụng (như của tôi).
enderland

@enderland: ĐẦU của bạn luôn chỉ vào một số chi nhánh, bình thường :)
Alexander Pavlov

Tôi đã gặp sự cố khi phải sử dụng toàn bộ hàm băm cam kết vì một phần không được chấp nhận.
mightyiam

6
Upvote để git bisecttham khảo; Thật là một công cụ cực kỳ hữu ích!
Niek

54

Đầu tiên, sử dụng git logđể xem nhật ký, chọn cam kết bạn muốn, ghi lại hàm băm sha1 được sử dụng để xác định cam kết. Tiếp theo, chạy git checkout hash. Sau khi bạn đã hoàn thành , git checkout original_branch. Điều này có lợi thế là không di chuyển ĐẦU, nó chỉ đơn giản là chuyển bản sao làm việc sang một cam kết cụ thể.


4
Tôi nghĩ bạn có ý nghĩa git checkout <original_branch>. git checkout HEADthực sự là một NOOP
Abe Voelker

3
git reset --hard <hash>thay đổi tiêu đề của chi nhánh hiện tại, trong khi git checkout <hash>bạn nhận được một thanh toán tách rời mà không thay đổi bất kỳ chi nhánh nào và bạn có thể dễ dàng quay lại mà không cần biết ID băm gốc của chi nhánh như trong câu trả lời này.
jofel

@Femaref Câu hỏi của người mới bắt đầu: được đặt trong bối cảnh của câu hỏi này (tạm thời chuyển sang một cam kết trước đó), tại sao nó lại là một lợi thế hoặc bất lợi khi di chuyển hoặc không di chuyển ĐẦU?
hấp dẫn về

@nuttyaboutnatty Giả sử bản chỉnh sửa của tôi được chấp thuận, nó sẽ trả lời câu hỏi của bạn. ĐẦU thực sự được di chuyển trong bất kỳ sự kiện; nhưng trong kiểm tra, các điểm tham chiếu chi nhánh tới không tự di chuyển.
echristopherson

15

Ngoài các câu trả lời khác ở đây chỉ cho bạn cách để git checkout <the-hash-you-want>biết rằng bạn có thể quay lại nơi bạn đang sử dụng:

git checkout @{-1}

Điều này thường thuận tiện hơn:

git checkout what-was-that-original-branch-called-again-question-mark

Như bạn có thể dự đoán, git checkout @{-2}sẽ đưa bạn trở lại chi nhánh mà bạn đã ở hai git checkoutgiây trước và tương tự cho các số khác. Nếu bạn có thể nhớ bạn đã ở đâu với số lượng lớn hơn, bạn sẽ nhận được một số loại huy chương cho điều đó.


Đáng buồn thay cho năng suất, git checkout @{1}không đưa bạn đến chi nhánh mà bạn sẽ làm trong tương lai, đó là một sự xấu hổ.


1
Lưu ý rằng đó git checkout -là một bí danh tốc ký chogit checkout @{-1}
Nathanael

@Nathanael OMGOD , không đời nào điều này thay đổi mọi thứ! Rất vui, cảm ơn bạn! Tôi sẽ kết hợp điều này trong câu trả lời, nhưng tôi nghĩ cũng hữu ích khi biết về @{n}cú pháp chung , vì nó hoạt động với rất nhiều lệnh git. Tôi thấy thật khó để thêm tốc ký của bạn mà không làm cho câu trả lời khá khó hiểu. Thay vào đó tôi đã bình chọn bình luận của bạn - Tôi hy vọng mọi người sẽ thấy nó. Cảm ơn một lần nữa.
Stewohn

1
Không vấn đề gì. Cuộc thảo luận này là tiếp tuyến với câu hỏi thực tế nào. Thêm một phần thưởng! Tôi thường sử dụng cùng một cú pháp để hợp nhất các tính năng vào một bản phát hành. ví dụ: git merge -để hợp nhất chi nhánh bạn đã kiểm tra lần cuối vào chi nhánh hiện đang kiểm tra. Nó giống như cd -trong bash.
Nathanael
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.