Tôi đã xóa một tệp bằng Git và sau đó cam kết, vì vậy tệp không còn trong bản sao làm việc của tôi nữa. Tôi muốn xem nội dung của tệp đó, nhưng không thực sự khôi phục nó. Tôi có thể làm cái này như thế nào?
Tôi đã xóa một tệp bằng Git và sau đó cam kết, vì vậy tệp không còn trong bản sao làm việc của tôi nữa. Tôi muốn xem nội dung của tệp đó, nhưng không thực sự khôi phục nó. Tôi có thể làm cái này như thế nào?
Câu trả lời:
git show HEAD^:path/to/file
Bạn có thể sử dụng số nhận dạng cam kết rõ ràng hoặc HEAD~n
để xem các phiên bản cũ hơn hoặc nếu có nhiều hơn một cam kết kể từ khi bạn xóa nó.
fatal: Invalid object name 'HEAD^'.
(tôi phải đề cập đến, mà tôi đã chỉ "Initial cam kết")
Nếu đây là tệp bạn đã xóa trước đó và không muốn tìm kiếm bản sửa đổi , bạn có thể sử dụng (tệp được đặt tên foo
trong ví dụ này; bạn có thể sử dụng đường dẫn đầy đủ):
git show $(git rev-list --max-count=1 --all -- foo)^:foo
Lời rev-list
kêu gọi tìm kiếm tất cả các bản sửa đổi foo
nhưng chỉ liệt kê một bản. Vì rev-list
liệt kê theo thứ tự thời gian đảo ngược, nên những gì nó liệt kê là bản sửa đổi cuối cùng đã thay đổi foo
, sẽ là cam kết đã bị xóa foo
. (Điều này được dựa trên giả định rằng git không cho phép một tập tin đã xóa được thay đổi nhưng vẫn bị xóa.) Bạn không thể chỉ sử dụng các phiên bản mà rev-list
trở về như nó vốn có vì foo
không còn tồn tại ở đó. Bạn phải hỏi cho một ngay trước khi nó có chứa các phiên bản trước của tập tin, vì thế mà ^
trong git show
.
**/foo
nếu bạn không biết đường dẫn (điều này sẽ hoạt động đối với lệnh rev-list chứ không phải lệnh show. Tuy nhiên, với cam kết từ lệnh rev-list, bạn có thể tìm thấy đường dẫn).
Vì bạn có thể không nhớ lại đường dẫn chính xác, thay vào đó bạn có thể lấy sha1 từ nhật ký git sau đó bạn có thể chỉ cần đưa ra
git cat-file -p <sha1>
git whatchanged --no-abbrev
đưa ra kết quả tương tự như git (hoặc svn) log.
path/to/file
là đường dẫn đầy đủ từ đầu dự án (dir trên cùng của kho lưu trữ).