Xem tệp đã xóa trong Git


104

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:


144
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ó.


6
Lưu ý rằng đó path/to/filelà đường dẫn đầy đủ từ đầu dự án (dir trên cùng của kho lưu trữ).
Jakub Narębski

1
Tôi đã có fatal: Invalid object name 'HEAD^'.(tôi phải đề cập đến, mà tôi đã chỉ "Initial cam kết")
vladkras

1
Nếu việc xóa được dàn dựng nhưng không được cam kết, hãy sử dụng HEAD thay vì HEAD ^ (vì nó đã tồn tại trong HEAD). Ví dụ, tôi nghĩ rằng tôi cần tệp, vì vậy tôi đã thêm nó và cam kết lưu công việc của mình, sau đó xóa nó khi tôi nghĩ ra một giải pháp khác. Để xem các tập tin ban đầu trước khi cam kết một lần nữa, tôi đã làm git chương ĐẦU: path / to / file
Tony Wickham

1
Tôi nghĩ cũng cần nhắc lại rằng điều này chỉ hoạt động nếu tệp đã bị xóa trong lần cam kết gần đây nhất. Nếu tệp đã bị xóa vài lần trước, bạn sẽ cần sử dụng một trong các câu trả lời khác.
jayhendren

50

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 footrong 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-listkêu gọi tìm kiếm tất cả các bản sửa đổi foonhưng chỉ liệt kê một bản. Vì rev-listliệ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-listtrở về như nó vốn cófookhô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.


2
Bạn có thể cần thay đổi foo cuối cùng thành ./foo. Và đối với họ không sử dụng bash, hãy lấy id với "git rev-list --max-count = 1 --all - foo" rồi thực hiện "git show 5824127a8d99576632a04ac2b5c2344bcf751967: ./ foo" với id (524 .. is id)
Dror

1
Câu trả lời rất hay. Tôi đã phải sử dụng ~ thay vì ^. Không chắc chắn lý do tại sao. Và để mọi người hiểu rõ về nó, 'foo' ở đây phải là một đường dẫn đầy đủ từ git root.
pedorro

Bạn có thể viết **/foonế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).
Nickolai

10

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>

5
Thay mặt cho Samuel Slund : Một cách để tìm tổng sha1 để sử dụng ở trên là: git whatchanged --no-abbrevđưa ra kết quả tương tự như git (hoặc svn) log.
không khéo tiếng ồn
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.