git-checkout revisi file yang lebih lama dengan nama baru

264

Saya memiliki file " main.cpp" terbuka di editor saya.

Saya ingin melihat revisi sebelumnya dari "main.cpp " sebelumnya di editor juga.

Cara saya melakukannya sekarang adalah seperti ini.

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

Bisakah ini disederhanakan, jadi saya tidak perlu menutup "main.cpp" di editor?

Yang saya harapkan adalah varian git-checkoutyang bisa melakukan ini.


UPDATE: saya menggunakan git di mac osx 10.5.7

prompt> git --version
git version 1.6.0.4
prompt> 

UPDATE2: Jawaban Jakub Narębski adalah:

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

UPDATE3: Jawaban Karmi, untuk revisi tertentu:

prompt> git show 4c274dd91dc:higgs/Higgs.xcodeproj/project.pbxproj > old_project.pbxproj
prompt> 
neoneye
sumber
Editor apa yang Anda gunakan? Mungkin memiliki plugin / addon / modul yang menambahkan dukungan untuk Git?
Jakub Narębski
Saya menggunakan teman teks. Ini memiliki beberapa dukungan git, saya belum memeriksa apakah dapat melakukannya.
neoneye
Textmate memiliki bundel git: github.com/timcharper/git-tmbundle (Anda harus memeriksa halaman InterfacesFrontendsAndTools di git wiki: git.or.cz/gitwiki )
Jakub Narębski
Omong-omong, antarmuka VC di Emacs (yang mana Git juga memiliki dukungan dalam bentuk vc-git.el) memiliki perintah 'Tampilkan Versi Lain'. Jika TexMate Git Bundle (git-tmbundle) tidak memilikinya, mungkin ada baiknya menambahkannya.
Jakub Narębski
Saya menggunakan symlink untuk melacak proyek saya dengan lebih baik di TextMate. 25 dir, 300 file. Ini membantu menyembunyikan builddir dan dir yang tidak relevan lainnya. Namun git / TextMate tidak terlalu senang tentang symlink ini, sehingga tidak ada :-(
neoneye

Jawaban:

312

Anda dapat menggunakan "git show" untuk itu:

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

(Perhatikan bahwa ada :karakter titik dua [ ] di antara HEAD^dan main.cpp.) <revision>:<path>Sintaksnya dijelaskan dalam manual git rev-parse , di sebelah titik terakhir di bagian "Menentukan revisi":

  • <rev>: <path>, mis. HEAD: README,: README, master: ./ README

    Sufiks yang :diikuti oleh nama path gumpalan atau pohon di jalur yang diberikan dalam objek tree-ish dinamai oleh bagian sebelum titik dua. :path(dengan bagian kosong sebelum titik dua) adalah kasus khusus dari sintaks yang dijelaskan selanjutnya: konten yang direkam dalam indeks di jalur yang diberikan.

    Jalur yang dimulai dengan ./atau ../relatif terhadap direktori kerja saat ini. Jalur yang diberikan akan dikonversi menjadi relatif ke direktori root pohon yang bekerja. Ini paling berguna untuk mengatasi gumpalan atau pohon dari komit atau pohon yang memiliki struktur pohon yang sama dengan pohon yang bekerja.

Perhatikan bahwa di <path>sini adalah path LENGKAP relatif terhadap direktori teratas proyek Anda, yaitu direktori dengan .git/direktori. (Atau lebih tepatnya ke " <revisi> " (yang secara umum dapat berupa <tree-ish> , yaitu sesuatu yang mewakili pohon))

Jika Anda ingin menggunakan jalur relatif ke direktori saat ini, Anda perlu menggunakan ./<path>sintaks (atau ../pathnaik dari direktori saat ini).

Edit 2015-01-15: menambahkan informasi tentang sintaks jalur relatif


Dalam kebanyakan kasus, Anda bisa mendapatkan output yang sama menggunakan git cat-fileperintah level rendah (plumbing) :

prompt> git cat-file blob HEAD^:main.cpp > old_main.cpp
Jakub Narębski
sumber
3
Saya tertarik pada salinan lengkapnya, tetapi git-show hanya menunjukkan kepada saya perbedaannya. Saya sudah mencoba bermain-main dengan opsi --pretty .. prompt> git show --pretty = HEAD lebih lengkap ^ main.cpp tetapi tidak akan menyelesaikannya.
neoneye
7
"git show HEAD ^ main.cpp" (dengan spasi antara HEAD ^ dan main.cpp) BERBEDA dari "git show HEAD ^: main.cpp" (dengan titik dua ':' antara HEAD ^ dan main.cpp).
Jakub Narębski
Hmm, dengan titik dua saya melihat kesalahan ini, jadi saya berpikir bahwa titik dua itu kesalahan. Ya, sepertinya usus adalah jalan yang harus dilalui, tetapi bagaimana cara saya mengatasi ini? prompt> git show HEAD ^: main.cpp fatal: argumen ambigu 'HEAD ^: main.cpp': revisi yang tidak diketahui atau jalur yang tidak ada di pohon kerja. Gunakan '-' untuk memisahkan jalur dari revisi prompt>
neoneye
2
Itu mungkin berarti bahwa Anda telah memberikan PATHNAME yang salah (sayangnya karena "git show" magic git tidak dapat memberikan pesan kesalahan yang lebih baik). Seharusnya FULL pathname relatif terhadap direktori teratas proyek Anda: $ (git ls-tree -r --name-only HEAD ^ | grep main.cpp)
Jakub Narębski
3
Alih-alih jalur lengkap, dari dokumen: "Jalur yang dimulai dengan ./ atau ../ relatif terhadap direktori kerja saat ini." Bekerja pada versi 1.8.5 saya.
LVB
24

Hanya untuk menambah jawaban Jakub: Anda bahkan tidak perlu mengarahkan ulang output ke file >, jika Anda hanya tertarik membaca sekilas isi file di terminal. Anda bisa berlari $ git show 58a3db6:path/to/your/file.txt.

karmi
sumber