Jawaban:
Pada halaman manual git stash Anda dapat membaca (di bagian "Diskusi", tepat setelah deskripsi "Opsi") bahwa:
Sebuah simpanan diwakili sebagai komit yang pohonnya mencatat keadaan direktori kerja, dan induk pertamanya adalah komit di HEAD ketika simpanan dibuat.
Jadi Anda bisa memperlakukan simpanan (mis. Simpanan stash@{0}
pertama / teratas) sebagai gabungan komit, dan gunakan:
$ git diff stash@{0}^1 stash@{0} -- <filename>
Penjelasan: stash@{0}^1
berarti induk pertama dari simpanan yang diberikan, yang sebagaimana dinyatakan dalam penjelasan di atas adalah komit di mana perubahan disimpan. Kami menggunakan bentuk "git diff" (dengan dua komit) karena stash@{0}
/ refs/stash
adalah gabungan komit, dan kami harus memberi tahu git induk yang ingin kami bedakan. Lebih samar:
$ git diff stash@{0}^! -- <filename>
seharusnya juga berfungsi (lihat manual git rev-parse untuk penjelasan tentang rev^!
sintaks, di bagian "Menentukan rentang").
Demikian juga, Anda dapat menggunakan checkout git untuk memeriksa satu file dari simpanan:
$ git checkout stash@{0} -- <filename>
atau untuk menyimpannya di bawah nama file lain:
$ git show stash@{0}:<full filename> > <newfile>
atau
$ git show stash@{0}:./<relative filename> > <newfile>
( perhatikan bahwa di sini <nama file lengkap> adalah nama path lengkap file relatif ke direktori teratas proyek (pikirkan: relatif terhadap stash@{0}
)).
Anda mungkin perlu melindungi stash@{0}
dari ekspansi shell, yaitu menggunakan "stash@{0}"
atau 'stash@{0}'
.
git checkout
halaman manual. Itu tidak dapat menjatuhkan file ke lokasi lain. Ada referensi untuk ini di: stackoverflow.com/questions/888414/…
git checkout
pendekatan ini menyalin file yang tepat dari simpanan - tidak menggabungkannya dengan apa yang ada di direktori kerja Anda git stash apply
. (Jadi jika Anda memiliki perubahan dari pangkalan tempat penyimpanan dibuat, mereka akan hilang).
git stash apply
menggabungkan perubahan dalam file yang telah dimodifikasi di pohon kerja sejak file disimpan, file di pohon kerja harus dipentaskan. Agar penggabungan otomatis berfungsi, file yang sama tidak dapat dimodifikasi baik di copy yang berfungsi maupun di copy yang akan disatukan. Akhirnya, berlaku simpanan tidak menghapus item dari simpanan seperti git stash pop
akan.
Jika Anda menggunakan git stash apply
alih-alih git stash pop
, itu akan menerapkan simpanan ke pohon kerja Anda tetapi tetap menyimpan simpanan.
Dengan ini selesai, Anda bisa add
/ commit
file yang Anda inginkan dan kemudian mengatur ulang perubahan yang tersisa.
git stash pop stash@{0}
(daftar perubahan yang disembunyikan: git stash list
)
Ada cara mudah untuk mendapatkan perubahan dari cabang apa pun, termasuk simpanan:
$ git checkout --patch stash@{0} path/to/file
Anda dapat menghilangkan spesifikasi file jika Anda ingin menambal di banyak bagian. Atau hilangkan tambalan (tetapi bukan path) untuk mendapatkan semua perubahan pada satu file. Ganti 0
dengan nomor simpanan dari git stash list
, jika Anda memiliki lebih dari satu. Perhatikan bahwa ini seperti diff
, dan menawarkan untuk menerapkan semua perbedaan di antara cabang-cabang. Untuk mendapatkan perubahan dari hanya satu komit / simpanan, lihat git cherry-pick --no-commit
.
git help checkout
. --patch
tidak penggabungan interaktif, Ini berlaku apa pun yang Anda menyetujui dalam shell (atau apa pun yang Anda simpan jika Anda memilih untuk e
menambal patch). Path sendiri akan menimpa file, seperti yang saya tulis, "semua perubahan".
git config --global alias.applydiffat '!git checkout --patch "$1" -- $(git diff --name-only "$1"^ "$1")'
- maka melakukan git applydiffat stash@{4}
hanya menggunakan file yang berubah antara simpanan dan induknya.
Untuk melihat seluruh file: git show stash@{0}:<filename>
Untuk melihat perbedaannya: git diff stash@{0}^1 stash@{0} -- <filename>
diff
dengan difftool
menggunakan diff eksternal favorit Anda.
$ git checkout stash@{0} -- <filename>
Catatan:
Pastikan Anda memberi spasi setelah "-" dan parameter nama file
Ganti nol (0) dengan nomor simpanan spesifik Anda. Untuk mendapatkan daftar simpanan, gunakan:
git stash list
Berdasarkan jawaban Jakub Narębski - Versi lebih pendek
Anda bisa mendapatkan diff untuk simpanan dengan " git show stash@{0}
" (atau berapa pun jumlah simpanan itu; lihat "daftar simpanan git"). Sangat mudah untuk mengekstrak bagian diff untuk satu file.
git show stash
untuk menunjukkan simpanan paling atas (biasanya satu-satunya yang Anda miliki). Demikian pula Anda dapat menunjukkan perbedaan antara cabang Anda saat ini dan simpanan dengan git diff head stash
.
Konsep paling sederhana untuk dipahami, meskipun mungkin bukan yang terbaik, adalah Anda memiliki tiga file yang diubah dan Anda ingin menyimpan satu file.
Jika Anda git stash
menyembunyikan semua, git stash apply
untuk mengembalikannya lagi dan kemudian git checkout f.c
pada file yang dimaksud untuk meresetnya secara efektif.
Saat Anda ingin melepaskan file run, lakukan git reset --hard
dan kemudian jalankan git stash apply
lagi, manfaatkan fakta yang git stash apply
tidak menghapus perbedaan dari tumpukan simpanan.
Jika file simpanan perlu bergabung dengan versi saat ini, maka gunakan cara-cara sebelumnya menggunakan diff. Kalau tidak, Anda dapat menggunakan git pop
untuk melepaskan mereka, git add fileWantToKeep
untuk pementasan file Anda, dan melakukan git stash save --keep-index
, untuk menyimpan semuanya kecuali apa yang ada di atas panggung. Ingatlah bahwa perbedaan cara ini dengan yang sebelumnya adalah bahwa "muncul" file dari simpanan. Jawaban sebelumnya tetap git checkout stash@{0} -- <filename>
sesuai dengan kebutuhan Anda.
Gunakan berikut ini untuk menerapkan perubahan pada file simpanan ke pohon kerja Anda.
git diff stash^! -- <filename> | git apply
Ini umumnya lebih baik daripada menggunakan git checkout
karena Anda tidak akan kehilangan perubahan yang Anda buat ke file sejak Anda membuat simpanan.
Menggunakan ekstensi Git Stash di Visual Studio Code