Câu hỏi Có lệnh git nhanh nào để xem phiên bản cũ của tệp không?


Có lệnh nào trong lệnh git để xem (hoặc bị bán phá giá thành stdout hay không) $PAGER hoặc là $EDITOR) phiên bản cụ thể của một tệp cụ thể?


1193
2017-12-03 19:31


gốc


Làm thế nào để có được một bản sao của một phiên bản cũ của một tập tin trong một kho git? - phuclv


Các câu trả lời:


Bạn có thể dùng git show:

$ git show REVISION:path/to/file

Thay thế REVISION bằng bản sửa đổi thực tế của bạn (có thể là Git commit SHA, tên thẻ, tên chi nhánh, tên cam kết tương đối hoặc bất kỳ cách nào khác để xác định cam kết trong Git)

Ví dụ: để xem phiên bản của tệp src/main.c từ 4 cam kết trước, sử dụng:

$ git show HEAD~4:src/main.c

Lưu ý rằng đường dẫn là từ gốc của kho lưu trữ trừ khi nó bắt đầu bằng ./ hoặc ../ để chỉ ra một đường dẫn tương đối. Để biết thêm thông tin, hãy xem trang hướng dẫn cho git-show.


1336
2017-12-03 19:46



Điều đó dường như không thực sự hiệu quả - bạn có thử không? Đối với "git show HEAD: path / to / file.c", tôi gặp lỗi "đối số mơ hồ". - mike
Vâng, tôi đã thử nó - nó làm việc cho tôi. - mipadi
Nếu bạn đang ở trên cửa sổ, nó có thể là một điều phân cách đường dẫn; nếu tôi làm git hiển thị HEAD: dir \ subdir \ file, tôi nhận được đối số liên tiếp. Nếu tôi làm git hiển thị HEAD: dir / subdir / file, nó hoạt động như mong đợi. - Matt McMinn
Đường dẫn bạn phải cung cấp sau: là từ gốc của kho git. (điều này đã được đưa ra dưới đây như là một câu trả lời nhưng tôi nghĩ rằng nó đã được dự định như là một bình luận về câu trả lời này) - MatrixFrog
Nếu bạn muốn nhìn thấy nó trong một phân chia Vim để họ cuộn lại với nhau, tôi đã viết một đoạn ngắn bài viết trên blog cho thấy làm thế nào để làm điều đó. - Flaviu


Thực hiện việc này theo ngày như sau:

git show HEAD@{2013-02-25}:./fileInCurrentDirectory.txt

Lưu ý rằng HEAD@{2013-02-25} có nghĩa là "nơi HEAD vào ngày 2013-02-25" trong kho lưu trữ này (sử dụng reflog), không phải "cam kết cuối cùng trước 2013-02-25 trong nhánh này trong lịch sử".


208
2018-03-07 17:05



Tuyệt vời. Tiết kiệm thời gian của tôi rất nhiều thay vì đi đến github và nhìn vào cam kết. - Fizer Khan
"Dấu chấm" trên đường dẫn tệp là vấn đề của tôi. Cảm ơn! - tomascharad
Lệnh này hữu ích với master thay vì HEAD@{2013-02-25}, nếu bạn đang ở trên chi nhánh - funroll
Bạn có thể bao gồm thời gian, à la git log --since='2016-04-28 23:59:59 +0100'? - dumbledad
Thực tế cú pháp này sử dụng reflog là quan trọng và cần được đánh dấu mạnh mẽ, bởi vì các reflog không chứa tất cả các cam kết. Xem blog.endpoint.com/2014/05/git-checkout-at-specific-date.html - Alice Heaton


Nếu bạn thích GUI, bạn có thể sử dụng gitk:

  1. bắt đầu gitk với:

    gitk /path/to/file
    
  2. Chọn bản sửa đổi ở phần trên cùng của màn hình, ví dụ: theo mô tả hoặc ngày tháng. Theo mặc định, phần dưới của màn hình hiển thị sự khác biệt cho bản sửa đổi đó (tương ứng với nút radio "vá").

  3. Để xem tệp cho bản sửa đổi được chọn:

    • Nhấp vào nút radio "cây". Điều này sẽ hiển thị gốc của cây tập tin tại bản sửa đổi đó.
    • Xem chi tiết tệp của bạn.

98
2017-12-19 18:21



Điều này cũng làm việc với tig, là một người xem git repo nguyền rủa. - Matthew G
@Paul Slocum: Có thể bởi vì lệnh này không phải là một lệnh thông thường, không phải là tích hợp của git. Tôi nghĩ rằng lệnh này chỉ làm việc cho Windows. - Envil
gitk hoạt động tốt trên mac (có vẻ là Tcl / Tk dựa). - Trausti Kristjansson
Lưu ý điều này dường như chỉ hoạt động nếu bạn bắt đầu từ thư mục gốc của kho lưu trữ git của bạn. - Marc
Nếu bạn muốn kiểm tra một phiên bản nào đó với gitk, bạn cũng có thể sử dụng phím tắt này: gitk REVISION /path/to/file. Điều này có thể có ích khi bạn muốn kiểm tra đối với một phiên bản nhất định chẳng hạn. - Christian.D


Bạn cũng có thể chỉ định commit hash (thường được gọi là commit ID) với git show chỉ huy.


Tóm lại

git show <commitHash>:/path/to/file


Từng bước một

  1. Hiển thị nhật ký của tất cả các thay đổi cho một tệp đã cho git log /path/to/file
  2. Trong danh sách các thay đổi được hiển thị, nó hiển thị commit hash nhu la commit 06c98... (06c98 ... là băm cam kết)
  3. Sao chép commit hash
  4. Chạy lệnh git show <commitHash>:/path/to/file sử dụng commit hashcủa bước 3 và path/to/file của bước 1.

Chú thích: thêm ./ khi chỉ định đường dẫn tương đối có vẻ quan trọng, tức là git show b2f8be577166577c59b55e11cfff1404baf63a84:./flight-simulation/src/main/components/nav-horiz.html.


70
2017-11-03 11:21



trong trường hợp bạn không biết đường dẫn đến tệp, hãy sử dụng git show <SHA1> --name-only để có được nó. - Tiina
lệnh này op - thậm chí tự động hoàn thành từ bộ nhớ - được thử nghiệm trên một thư mục đã xóa ... không thể nhận được nhiều op hơn gg đó - ThisGuyHasTwoThumbs
Các ./ là cần thiết cho tôi; cảm ơn bạn. - Anomaly


Ngoài Jim Hunzikercâu trả lời,

bạn có thể xuất tệp từ bản sửa đổi thành,

git show HEAD@{2013-02-25}:./fileInCurrentDirectory.txt > old_fileInCurrentDirectory.txt

Hi vọng điêu nay co ich :)


29
2018-04-30 05:07





git log -p sẽ hiển thị cho bạn không chỉ các bản ghi cam kết mà còn là sự khác biệt của từng cam kết (trừ các cam kết hợp nhất). Sau đó, bạn có thể nhấn /, nhập tên tệp và nhấn enter. nhấn n hoặc là p để đi đến lần xuất hiện tiếp theo / trước đó. Bằng cách này bạn sẽ không chỉ thấy những thay đổi trong tập tin mà còn là thông tin cam kết.


13
2018-05-06 20:02



Giống như git log -pm cũng sẽ hiển thị các cam kết hợp nhất. - sanbor


Bạn có thể sử dụng một tập lệnh như thế này để đổ tất cả các phiên bản của một tệp để phân tách các tệp:

ví dụ.

git_dump_all_versions_of_a_file.sh path/to/somefile.txt

Nhận được kịch bản ở đây như một câu trả lời cho một câu hỏi tương tự khác


2
2017-10-30 17:01



git_root, git_log_short và git_log_message_for_commit đang mất tích. - mogsie
Nắm bắt tốt! Tôi đã đăng câu trả lời này lên 2 điểm khác nhau và chỉ cần xóa câu trả lời này và liên kết với người khác, nơi mọi người đã nói với tôi về điều này trước khi ... cảm ơn @mogsie! - Brad Parks