Saya ingin tahu apakah mungkin untuk mengekstrak satu file atau berbeda dari file dari git simpanan tanpa menghentikan perubahan set off.
Mungkinkah ada yang bisa memberikan beberapa saran / ide tentang ini?
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 Andagit 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 sepertigit stash pop
akan.Jika Anda menggunakan
git stash apply
alih-alihgit 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.sumber
git stash pop stash@{0}
(daftar perubahan yang disembunyikan:git stash list
)Ada cara mudah untuk mendapatkan perubahan dari cabang apa pun, termasuk simpanan:
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 darigit stash list
, jika Anda memiliki lebih dari satu. Perhatikan bahwa ini sepertidiff
, dan menawarkan untuk menerapkan semua perbedaan di antara cabang-cabang. Untuk mendapatkan perubahan dari hanya satu komit / simpanan, lihatgit cherry-pick --no-commit
.sumber
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 untuke
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 melakukangit applydiffat stash@{4}
hanya menggunakan file yang berubah antara simpanan dan induknya.Jawaban singkat
Untuk melihat seluruh file:
git show stash@{0}:<filename>
Untuk melihat perbedaannya:
git diff stash@{0}^1 stash@{0} -- <filename>
sumber
diff
dengandifftool
menggunakan diff eksternal favorit Anda.Catatan:
Pastikan Anda memberi spasi setelah "-" dan parameter nama file
Ganti nol (0) dengan nomor simpanan spesifik Anda. Untuk mendapatkan daftar simpanan, gunakan:
Berdasarkan jawaban Jakub Narębski - Versi lebih pendek
sumber
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.sumber
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 dengangit 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 kemudiangit checkout f.c
pada file yang dimaksud untuk meresetnya secara efektif.Saat Anda ingin melepaskan file run, lakukan
git reset --hard
dan kemudian jalankangit stash apply
lagi, manfaatkan fakta yanggit stash apply
tidak menghapus perbedaan dari tumpukan simpanan.sumber
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 melakukangit 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 tetapgit checkout stash@{0} -- <filename>
sesuai dengan kebutuhan Anda.sumber
Gunakan berikut ini untuk menerapkan perubahan pada file simpanan ke pohon kerja Anda.
Ini umumnya lebih baik daripada menggunakan
git checkout
karena Anda tidak akan kehilangan perubahan yang Anda buat ke file sejak Anda membuat simpanan.sumber
Menggunakan ekstensi Git Stash di Visual Studio Code
sumber