git simpanan menerapkan versi

513

Saya memiliki 2 cabang: master | rancangan

Bekerja dalam desain saya melakukan simpanan dan beralih ke master, membuat beberapa penyesuaian. Beralih kembali ke desain dan melakukan stash applyhanya untuk kehilangan semua perubahan saya di cabang desain.

Saya berharap semua pekerjaan saya dalam simpanan karena saya belum membersihkan atau menghapus ini.

Jika saya melakukan daftar simpanan saya mendapatkan 4 hasil:

stash@{0}: WIP on design: f2c0c72... Adjust Password Recover Email
stash@{1}: WIP on design: f2c0c72... Adjust Password Recover Email
stash@{2}: WIP on design: eb65635... Email Adjust
stash@{3}: WIP on design: eb65635... Email Adjust

Jika saya coba git stash apply f2c0c72saya mendapat kesalahan:

fatal: Needed a single revision
f2c0c72: no valid stashed state found

Bagaimana saya bisa menerapkan simpanan tertentu?

Lee
sumber
26
Perhatikan bahwa Anda memiliki sintaks sekarang (Q4 2016, Git 2.11) git stash apply 0(bukan git stash apply stash@{0}). Lihat jawaban saya di sini .
VonC

Jawaban:

839

Kunci ke simpanan sebenarnya adalah stash@{n}item di sebelah kiri. Jadi cobalah:

git stash apply stash@{0}

(perhatikan bahwa dalam beberapa shell Anda perlu mengutip "stash@{0}", seperti zsh, fish, dan powershell).

Sejak versi 2.11, sangat mudah, Anda dapat menggunakan nomor N stack alih-alih menggunakan stash@{n}. Jadi sekarang alih-alih menggunakan:

git stash apply "stash@{n}"

Anda dapat mengetik:

git stash apply n

Untuk mendapatkan daftar simpanan:

git stash list

Sebenarnya stash@{0}adalah revisi di git yang bisa Anda alihkan ke ... tetapi git stash apply ...harus mencari tahu bagaimana DTRT untuk menerapkannya ke lokasi Anda saat ini.

araqnid
sumber
90
Catat saja bahwa pada beberapa shell, simpanan @ {n} harus dikutip.
Senjai
7
Kiat lain: Anda dapat melakukan mis gitk stash@{0}untuk menunjukkan perubahan yang Anda buat dalam simpanan tertentu.
Antinome
11
Pengguna zsh perlu menggandakan kutipan misalnyagit stash apply "stash@{0}"
mynameistechno
7
stash@{n}adalah perintah yang paling canggung untuk mengetik. Apakah ada cara pintas untuk melakukan ini selain membuat alias atau fungsi Anda sendiri?
Dylanthepiguy
2
git stash apply ndamai
Victor
242

Untuk menerapkan simpanan dan menghapusnya dari daftar simpanan, jalankan:

git stash pop stash@{n}

Untuk menerapkan simpanan dan menyimpannya di simpanan simpanan, jalankan:

git stash apply stash@{n}
Dan Loewenherz
sumber
8
Ini bagus, terima kasih untuk membedakan antara dua opsi. Saya baru saja mencoba ini dan tampaknya bahwa jika Anda menghapus simpanan dari branch-a ke branch-b, simpanan masih akan tetap ada di cache simpanan. Saya kira itu akan jadi Anda masih memiliki opsi untuk pop / menerapkan simpanan ke cabang-a di masa mendatang. Benar-benar harapan yang masuk akal. Berguna!
longda
42
Untuk PowerShell:git stash pop "stash@{n}"
ankitjaininfo
1
PowerShell senang dengan kurung kurawal di tanda kutip / tanda kutip tunggal:git stash apply stash@"{n}"
m1kael
PowerShell juga akan menerima git stash apply stash@`{n`}(perhatikan backticks sebelum kawat gigi).
Ian Kemp
52

Sejak versi 2.11, sangat mudah, Anda dapat menggunakan nomor N stack alih-alih mengatakan "stash@{n}". Jadi sekarang alih-alih menggunakan:

git stash apply "stash@{n}"

Anda dapat mengetik:

git stash apply n

Misalnya, dalam daftar Anda:

stash@{0}: WIP on design: f2c0c72... Adjust Password Recover Email
stash@{1}: WIP on design: f2c0c72... Adjust Password Recover Email
stash@{2}: WIP on design: eb65635... Email Adjust
stash@{3}: WIP on design: eb65635... Email Adjust

Jika Anda ingin mendaftar, stash@{1}Anda dapat mengetik:

git stash apply 1

Jika tidak, Anda dapat menggunakannya bahkan jika Anda memiliki beberapa perubahan dalam direktori Anda sejak 1.7.5.1, tetapi Anda harus yakin bahwa simpanan tidak akan menimpa perubahan direktori kerja Anda jika itu terjadi, Anda akan mendapatkan kesalahan:

error: Your local changes to the following files would be overwritten by merge:
        file
Please commit your changes or stash them before you merge.

Dalam versi sebelum 1.7.5.1, itu menolak untuk bekerja jika ada perubahan pada direktori kerja.


Catatan rilis Git:

Pengguna selalu harus mengatakan "simpanan @ {$ N}" ketika menamai satu elemen di lokasi default simpanan, yaitu reflog di ref / simpanan. Perintah "git stash" belajar menerima "git stash apply 4" sebagai kependekan dari "git stash apply stash @ {4}"

git simpanan berlaku "digunakan untuk menolak bekerja jika ada perubahan pada pohon yang bekerja, bahkan ketika perubahan tidak tumpang tindih dengan perubahan simpanan dicatat

Pau
sumber
41

Jika ada di mesin Windows dan di PowerShell, orang perlu mengutip argumen seperti:

git stash apply "stash@{0}"

... atau untuk menerapkan perubahan dan menghapus dari simpanan:

git stash pop "stash@{0}"

Kalau tidak, tanpa tanda kutip Anda mungkin mendapatkan kesalahan ini:

fatal: argumen ambigu 'stash @': revisi tidak diketahui atau jalur tidak ada di pohon kerja.

jterry
sumber
Rupanya ini adalah bagaimana Anda harus melakukannya ketika menggunakan kerang ikan di Mac OSX 10.11 juga.
lps
8
git stash list

lalu pilih simpanan untuk diterapkan dan gunakan hanya nomor:

git stash apply 1
panthari
sumber
2
Git Stash list 

Daftar akan menampilkan semua item simpanan, misalnya: simpanan @ {0} :, simpanan @ {1}:, .., simpanan @ {n}:

Kemudian pilih angka n yang menunjukkan simpanan @ {n}:

git stash apply n 

for eg: git stash apply 1 will apply that particular stashed changes to the current branch
Harshavardhan reddy.
sumber