Saya memiliki repositori Git dan saya ingin melihat bagaimana beberapa file terlihat beberapa bulan yang lalu. Saya menemukan revisi pada tanggal itu; itu 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8
. Saya perlu melihat seperti apa satu file itu, dan juga menyimpannya sebagai file ("baru").
Saya berhasil melihat file menggunakan gitk
, tetapi tidak memiliki opsi untuk menyimpannya. Saya mencoba dengan alat baris perintah, yang paling dekat yang saya dapatkan adalah:
git-show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 my_file.txt
Namun, perintah ini menunjukkan perbedaan, dan bukan isi file. Saya tahu nantinya saya bisa menggunakan sesuatu seperti PAGER=cat
dan mengarahkan output ke file, tetapi saya tidak tahu bagaimana untuk sampai ke konten file yang sebenarnya.
Pada dasarnya, saya mencari sesuatu seperti svn cat .
sumber
git show
(tidak membantu) menggunakan sintaks yang berbeda dengan titik dua.git show 2c7cf:my_file.txt
>
Jawaban:
Untuk melengkapi jawaban Anda sendiri, sintaksnya memang
Perintah ini menggunakan gaya revisi yang biasa, artinya Anda dapat menggunakan salah satu dari yang berikut ini:
HEAD
+ x jumlah^
karakterTip Penting untuk diingat bahwa ketika menggunakan "
git show
", selalu tentukan path dari root repositori , bukan posisi direktori Anda saat ini.(Meskipun Mike Morearty menyebutkan bahwa, setidaknya dengan git 1.7.5.4, Anda dapat menentukan jalur relatif dengan meletakkan "
./
" di awal jalur - misalnya:)
Dengan Git 2.23+ (Agustus 2019), Anda juga dapat menggunakan perintah
git restore
pengganti yang membingungkangit checkout
Itu akan mengembalikan pada pohon yang bekerja hanya file yang ada di "source" (
-s
) commit SHA1 atau cabangsomebranch
.Untuk mengembalikan juga indeks:
(
-SW
: kependekan dari--staged --worktree
)Sebelum git1.5.x, itu dilakukan dengan beberapa pipa ledeng:
git ls-tree <rev>
perlihatkan daftar satu atau lebih objek 'gumpalan' di dalam komit
git cat-file blob <file-SHA1>
cat file seperti yang telah dilakukan dalam revisi tertentu (mirip dengan svn cat). gunakan git ls-tree untuk mengambil nilai file-sha1 yang diberikan
git-ls-tree mencantumkan ID objek untuk $ file dalam revisi $ REV, ini dipotong dari output dan digunakan sebagai argumen untuk git-cat-file, yang seharusnya benar-benar disebut git-cat-objek, dan hanya membuang objek itu ke stdout.
Catatan: sejak Git 2.11 (Q4 2016), Anda dapat menerapkan filter konten ke
git cat-file
output!Lihat komit 3214594 , komit 7bcf341 (09 Sep 2016), komit 7bcf341 (09 Sep 2016), dan komi b9e62f6 , komit 16dcc29 (24 Agu 2016) oleh Johannes Schindelin (
dscho
) .(Digabung oleh Junio C Hamano -
gitster
- dalam komit 7889ed2 , 21 Sep 2016)Catatan: "
git cat-file --textconv
" mulai melakukan segmentasi baru-baru ini (2017), yang telah diperbaiki di Git 2.15 (Q4 2017)Lihat komit cc0ea7c (21 Sep 2017) oleh Jeff King (
peff
) .(Digabung oleh Junio C Hamano -
gitster
- di commit bfbc2fc , 28 Sep 2017)Perhatikan bahwa untuk mengganti / mengganti file dengan konten yang lalu, Anda seharusnya tidak menggunakan perintah yang membingungkan
git checkout
lagi, tetapigit restore
(Git 2.23+, Agustus 2019)Itu akan mengembalikan pada pohon yang bekerja hanya file yang ada di "source" (
-s
) commit SHA1.Untuk mengembalikan juga indeks:
(
-SW
: kependekan dari--staged --worktree
)sumber
git show
pada dasarnya membuang konten padastdout
(output standar), Anda bisa mengarahkan ulang output itu ke file apa pun yang Anda inginkan ( tldp.org/LDP/abs/html/io-redirection.html ).git checkout [branch | revision] filepath
adalah perintah yang tepatgit checkout
akan mengganti file Anda dengan versi lain, yang bertentangangit show
, yang memungkinkan Anda untuk menyimpannya dengan nama yang berbeda, agar Anda dapat melihat dan melihat keduanya (versi saat ini dan versi lama). Tidak jelas dari pertanyaan apakah OP ingin mengganti versi saat ini dengan yang lama.^^^
juga dapat ditulis lebih umum sebagai~~~
atau, lebih baik~3
,. Menggunakan tilde juga memiliki keuntungan tidak memicu pencocokan nama file dari beberapa shell (zsh, misalnya).git rev-parse
menanganirev:path
sintaks? (Dalam git yang lebih baru Anda bisagit cat-file -p $REV:path
. Namun,git show
bekerja untuk jalur direktori juga, jadi ini bukan hanya lebih pendek, biasanya lebih dekat dengan apa yang diinginkan.)Jika Anda ingin mengganti / menimpa konten file di cabang Anda saat ini dengan konten file dari komit sebelumnya atau cabang lain, Anda dapat melakukannya dengan perintah ini:
atau
Anda kemudian harus melakukan perubahan itu agar efektif di cabang saat ini.
sumber
git show SHA1:PATH
solusinya hanya mencetak ke stdout.git help checkout
. Saya harus checkout subdirektori pada tanggal tertentu, dan menggunakan pendekatan ini, saya bisa membuat sintaks ini berfungsi:git checkout @{YYYY-MM-DD} sub-dir
Anda perlu memberikan path lengkap ke file:
sumber
git show --name-only
sudah cukup jugafull/repo/path/to
dan mencoba:,git show 27cf8e84:my_file.txt
Anda akan dihargai dengan pesan seperti: fatal: Path 'full / repo / path / ke / my_file.txt' ada, tetapi bukan 'my_file.txt' . Apakah maksud Anda '27cf8e84: full / repo / path / to / my_file.txt' alias '27cf8e84: ./ my_file.txt'? Ini seperti, Git bisa membantu secara langsung, tetapi memilih untuk menjadi jagoan disini.Cara termudah adalah menulis:
dimana:
Contoh
Ini akan menyimpan my_file.txt dari revisi 27cf8e sebagai file baru dengan nama my_file.txt.OLD
Itu diuji dengan Git 2.4.5.
Jika Anda ingin mengambil file yang dihapus, Anda dapat menggunakan
HASH~1
(satu komit sebelum HASH yang ditentukan).CONTOH:
sumber
git log file/path/name.ext
Di Windows, dengan Git Bash:
git show cab485c83b53d56846eb883babaaf4dff2f2cc46:./your_file.ext > old.ext
sumber
Dan untuk membuangnya ke file (setidaknya untuk Windows) - Git Bash:
The
"
kutipan diperlukan sehingga mempertahankan baris.sumber
git show
sintaks yang saya sebutkan di atas.Ini akan membantu Anda mendapatkan semua file yang terhapus di antara commit tanpa menentukan path, berguna jika ada banyak file yang dihapus.
sumber
perintah ini mendapatkan file yang disalin dari komit tertentu.
sumber
Dapatkan file dari komit sebelumnya melalui memeriksa-komit sebelumnya dan menyalin file.
git checkout 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8
git checkout theBranchYouNoted
git commit -m "added file ?? from previous commit"
sumber