git-checkout sửa đổi cũ hơn của một tập tin dưới một tên mới


264

Tôi có tệp " main.cpp" mở trong trình chỉnh sửa của mình.

Tôi cũng muốn xem bản sửa đổi trước của " main.cpp" trong trình chỉnh sửa .

Cách tôi làm bây giờ là như thế này.

close "main.cpp" in the editor

prompt> mv main.cpp tmp
prompt> git checkout HEAD^ main.cpp
prompt> mv main.cpp old_main.cpp
prompt> mv tmp main.cpp
prompt>

open "main.cpp" and "old_main.cpp" in the editor

Nó có thể được đơn giản hóa, vì vậy tôi không phải đóng "main.cpp" trong trình chỉnh sửa?

Những gì tôi hy vọng là một biến git-checkoutthể có thể làm điều này.


CẬP NHẬT: tôi đang sử dụng git trên mac osx 10.5.7

prompt> git --version
git version 1.6.0.4
prompt> 

CẬP NHẬT2: Câu trả lời của Jakub Narębski là:

prompt> git show HEAD^:dir1/dir2/dir3/main.cpp > old_main.cpp
prompt>

CẬP NHẬT3: Câu trả lời của Karmi, cho một sửa đổi cụ thể:

prompt> git show 4c274dd91dc:higgs/Higgs.xcodeproj/project.pbxproj > old_project.pbxproj
prompt> 

Bạn sử dụng trình soạn thảo nào? Có lẽ nó có plugin / addon / mô-đun thêm hỗ trợ cho Git?
Jakub Narębski

Tôi sử dụng bạn cùng văn. Nó có một số hỗ trợ git, tôi không kiểm tra xem nó có làm được không.
neoneye

Textmate có gói git: github.com/timcharper/git-tmbundle (bạn nên kiểm tra trang InterfacesFrontendsAndTools trên git wiki: git.or.cz/gitwiki )
Jakub Narębski

Nhân tiện, giao diện VC trong Emacs (mà Git cũng có hỗ trợ dưới dạng vc-git.el) có lệnh 'Hiển thị phiên bản khác'. Nếu TexMate Git Bundle (git-tmbundle) không có nó, có lẽ sẽ rất đáng để thêm nó.
Jakub Narębski

Tôi sử dụng symlink để theo dõi dự án của tôi tốt hơn trong TextMate. 25 thư mục, 300 tập tin. Điều này giúp che giấu builddirs và các dir không liên quan khác. Tuy nhiên git / TextMate không hài lòng về các liên kết tượng trưng này, vì vậy không :-(
neoneye

Câu trả lời:


312

Bạn có thể sử dụng "git show" cho điều đó:

prompt> git show HEAD^:main.cpp > old_main.cpp

(Lưu ý rằng có dấu hai chấm [ :] giữa HEAD^main.cpp.) <revision>:<path>Cú pháp được mô tả trong trang quản lý git rev-parse , bên cạnh điểm cuối cùng trong phần "Chỉ định sửa đổi":

  • <rev>: <path>, ví dụ: ĐẦU: README ,: README, master: ./ README

    Một hậu tố :theo sau là một đường dẫn đặt tên cho blob hoặc cây tại đường dẫn đã cho trong đối tượng cây-ish được đặt tên bởi phần trước dấu hai chấm. :path(với một phần trống trước dấu hai chấm) là trường hợp đặc biệt của cú pháp được mô tả tiếp theo: nội dung được ghi trong chỉ mục tại đường dẫn đã cho.

    Một đường dẫn bắt đầu bằng ./hoặc ../liên quan đến thư mục làm việc hiện tại. Đường dẫn đã cho sẽ được chuyển đổi thành tương đối với thư mục gốc của cây làm việc. Điều này hữu ích nhất để giải quyết một đốm màu hoặc cây từ một cam kết hoặc cây có cấu trúc cây giống như cây làm việc.

Lưu ý rằng <path>đây là đường dẫn ĐẦY ĐỦ liên quan đến thư mục trên cùng của dự án của bạn, tức là thư mục có .git/thư mục. (Hoặc chính xác hơn là " <revision> " (nói chung có thể là bất kỳ <cây-ish> , tức là thứ gì đó đại diện cho cây))

Nếu bạn muốn sử dụng đường dẫn liên quan đến thư mục hiện tại, bạn cần sử dụng ./<path>cú pháp (hoặc ../pathđi lên từ thư mục hiện tại).

Chỉnh sửa 2015-01-15: thêm thông tin về cú pháp đường dẫn tương đối


Trong hầu hết các trường hợp, bạn có thể nhận được cùng một đầu ra bằng cách sử dụng git cat-filelệnh cấp thấp (hệ thống ống nước) :

prompt> git cat-file blob HEAD^:main.cpp > old_main.cpp

3
Tôi quan tâm đến một bản sao đầy đủ, nhưng git-show chỉ cho tôi thấy sự khác biệt .. Tôi đã thử chơi xung quanh với tùy chọn --pretty .. prompt> git show --pretty = fuller HEAD ^ main.cpp nhưng nó đã không Sẽ giải quyết nó.
neoneye

7
"git show HEAD ^ main.cpp" (có khoảng cách giữa HEAD ^ và main.cpp) là KHÁC BIỆT từ "git show HEAD ^: main.cpp" (với dấu hai chấm ':' giữa HEAD ^ và main.cpp).
Jakub Narębski

Hmm, với dấu hai chấm tôi thấy lỗi này, vì vậy tôi nghĩ rằng dấu hai chấm là một lỗi. Vâng, có vẻ như đại tràng là con đường để đi, nhưng làm thế nào để tôi giải quyết điều này? prompt> git show HEAD ^: main.cpp fatal: đối số mơ hồ 'HEAD ^: main.cpp': không biết sửa đổi hoặc đường dẫn không có trong cây làm việc. Sử dụng '-' để tách các đường dẫn khỏi dấu nhắc sửa đổi>
neoneye

2
Điều đó có thể có nghĩa là bạn đã cung cấp sai PATHNAME (không may vì ma thuật "git show" git không thể đưa ra thông báo lỗi tốt hơn). Nó phải là tên đường dẫn ĐẦY ĐỦ liên quan đến thư mục trên cùng của dự án của bạn: $ (git ls-tree -r - name-only HEAD ^ | grep main.cpp)
Jakub Narębski

3
Thay vì đường dẫn đầy đủ, từ các tài liệu: "Một đường dẫn bắt đầu bằng ./ hoặc ../ có liên quan đến thư mục làm việc hiện tại." Hoạt động trên phiên bản 1.8.5 của tôi.
LVB

24

Chỉ cần thêm vào câu trả lời của Jakub: bạn thậm chí không phải chuyển hướng đầu ra sang một tệp >, nếu bạn chỉ quan tâm đến việc lướt qua nội dung tệp trong thiết bị đầu cuối. Bạn chỉ có thể chạy $ git show 58a3db6:path/to/your/file.txt.

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.