Jawaban mudah untuk pertanyaan mudah adalah git stash apply
Cukup periksa cabang tempat Anda ingin perubahan Anda, dan kemudian git stash apply
. Kemudian gunakan git diff
untuk melihat hasilnya.
Setelah Anda selesai dengan perubahan Anda — yang apply
terlihat bagus dan Anda yakin tidak perlu simpanan lagi — kemudian gunakan git stash drop
untuk menyingkirkannya.
Saya selalu menyarankan menggunakan git stash apply
daripada git stash pop
. Perbedaannya adalah bahwa apply
meninggalkan simpanan di sekitar untuk dicoba ulang dengan mudah apply
, atau untuk melihat, dll. Jika pop
mampu mengekstrak simpanan, ia akan segera juga drop
menyimpannya, dan jika Anda tiba-tiba menyadari bahwa Anda ingin mengekstraknya di suatu tempat lain (di cabang yang berbeda), atau dengan --index
, atau semacamnya, itu tidak mudah. Jika Anda apply
, Anda bisa memilih kapan drop
.
Meskipun demikian, itu semua sangat kecil, dan bagi pemula yang git, itu harus hampir sama. (Dan Anda dapat melewati semua ini!)
Bagaimana jika Anda melakukan hal-hal yang lebih maju atau lebih rumit?
Setidaknya ada tiga atau empat "cara untuk menggunakan git simpanan" yang berbeda. Di atas adalah untuk "cara 1", "cara mudah":
Anda mulai dengan cabang yang bersih, mengerjakan beberapa perubahan, dan kemudian menyadari Anda melakukannya di cabang yang salah. Anda hanya ingin mengambil perubahan yang Anda miliki sekarang dan "memindahkannya" ke cabang lain.
Ini adalah kasus yang mudah, dijelaskan di atas. Jalankan git stash save
(atau polos git stash
, hal yang sama). Lihatlah cabang lainnya dan gunakan git stash apply
. Ini membuat git untuk menggabungkan perubahan sebelumnya, menggunakan mekanisme gabungan yang agak kuat dari git. Periksa hasilnya dengan hati-hati (dengan git diff
) untuk melihat apakah Anda menyukainya, dan jika ya, gunakan git stash drop
untuk membuang simpanan. Kamu sudah selesai!
Anda memulai beberapa perubahan dan menyimpannya. Kemudian Anda pindah ke cabang lain dan mulai lebih banyak perubahan, lupa bahwa Anda memiliki yang tersimpan.
Sekarang Anda ingin menyimpan, atau bahkan memindahkan, perubahan ini , dan menerapkan simpanan Anda juga.
Anda sebenarnya bisa git stash save
lagi, karena git stash
membuat "tumpukan" perubahan. Jika Anda melakukan itu, Anda memiliki dua simpanan, satu hanya disebut stash
— tetapi Anda juga dapat menulis stash@{0}
— dan satu dieja stash@{1}
. Gunakan git stash list
(kapan saja) untuk melihat semuanya. Yang terbaru selalu yang bernomor terendah. Ketika Anda git stash drop
, itu menjatuhkan yang terbaru, dan yang stash@{1}
bergerak ke atas tumpukan. Jika Anda memiliki lebih banyak, yang stash@{2}
menjadi stash@{1}
, dan seterusnya.
Anda dapat apply
dan kemudian drop
simpanan khusus juga:, git stash apply stash@{2}
dan seterusnya. Menjatuhkan simpanan tertentu, hanya menomori kembali yang bernomor lebih tinggi. Sekali lagi, yang tanpa nomor juga stash@{0}
.
Jika Anda menumpuk banyak simpanan, itu bisa menjadi cukup berantakan (apakah simpanan yang saya inginkan stash@{7}
atau bukan stash@{4}
? Tunggu, saya hanya mendorong yang lain, sekarang mereka 8 dan 5?). Saya pribadi lebih suka mentransfer perubahan ini ke cabang baru, karena cabang memiliki nama, dan cleanup-attempt-in-December
jauh lebih berarti bagi saya daripada stash@{12}
. ( git stash
Perintah mengambil pesan penyimpanan opsional, dan itu bisa membantu, tapi entah bagaimana, semua simpanan saya baru saja dinamai WIP on branch
.)
(Extra-canggih) Anda telah menggunakan git stash save -p
, atau hati-hati git add
-ed dan / atau git rm
bit tertentu -ed kode Anda sebelum menjalankan git stash save
. Anda memiliki satu versi di area indeks / pementasan simpanan, dan versi lain (berbeda) di pohon kerja. Anda ingin mempertahankan semua ini. Jadi sekarang Anda gunakan git stash apply --index
, dan itu kadang gagal dengan:
Conflicts in index. Try without --index.
Anda menggunakan git stash save --keep-index
untuk menguji "apa yang akan dilakukan". Yang ini berada di luar cakupan jawaban ini; lihat jawaban StackOverflow ini sebagai gantinya.
Untuk kasus rumit, saya sarankan mulai di direktori kerja "bersih" terlebih dahulu, dengan melakukan perubahan yang Anda miliki sekarang (di cabang baru jika Anda suka). Dengan cara itu "suatu tempat" yang Anda terapkan, tidak memiliki yang lain di dalamnya, dan Anda hanya akan mencoba perubahan simpanan:
git status # see if there's anything you need to commit
# uh oh, there is - let's put it on a new temp branch
git checkout -b temp # create new temp branch to save stuff
git add ... # add (and/or remove) stuff as needed
git commit # save first set of changes
Sekarang Anda berada di titik awal "bersih". Atau mungkin lebih seperti ini:
git status # see if there's anything you need to commit
# status says "nothing to commit"
git checkout -b temp # optional: create new branch for "apply"
git stash apply # apply stashed changes; see below about --index
Hal utama yang harus diingat adalah bahwa "simpanan" adalah komit, itu hanya komit yang sedikit "lucu / aneh" yang bukan "di cabang". The apply
penampilan operasi pada apa yang komit berubah, dan mencoba untuk mengulanginya di manapun Anda berada sekarang. Stash akan tetap ada di sana ( apply
disimpan), jadi Anda bisa melihatnya lebih banyak, atau memutuskan ini adalah tempat yang salah apply
dan coba lagi secara berbeda, atau apa pun.
Kapan pun Anda memiliki simpanan, Anda dapat menggunakan git stash show -p
untuk melihat versi simpel dari simpanan. (Versi yang disederhanakan ini hanya melihat perubahan "final work tree", bukan perubahan indeks yang disimpan yang --index
mengembalikan secara terpisah.) Perintah git stash apply
, tanpa --index
, hanya mencoba membuat perubahan yang sama di direktori kerja Anda sekarang.
Ini benar bahkan jika Anda sudah memiliki beberapa perubahan. The apply
perintah senang untuk menerapkan simpanan untuk dimodifikasi direktori kerja (atau setidaknya, untuk mencoba untuk menerapkannya). Anda dapat, misalnya, melakukan ini:
git stash apply stash # apply top of stash stack
git stash apply stash@{1} # and mix in next stash stack entry too
Anda dapat memilih pesanan "terapkan" di sini, memilih simpanan tertentu untuk diterapkan dalam urutan tertentu. Perhatikan, bagaimanapun, bahwa setiap kali Anda pada dasarnya melakukan "git merge", dan seperti yang diperingatkan oleh dokumentasi gabungan:
Menjalankan git digabung dengan perubahan non-sepele yang tidak dikomit tidak disarankan: selagi mungkin, Anda mungkin berada dalam kondisi yang sulit untuk mundur jika terjadi konflik.
Jika Anda mulai dengan direktori bersih dan hanya melakukan beberapa git apply
operasi, mudah untuk mundur: gunakan git reset --hard
untuk kembali ke status bersih, dan ubah apply
operasi Anda . (Itu sebabnya saya sarankan memulai di direktori kerja bersih terlebih dahulu, untuk kasus rumit ini.)
Bagaimana dengan kasus terburuk yang mungkin terjadi?
Katakanlah Anda melakukan Banyak Barang Git Lanjutan, dan Anda telah membuat simpanan, dan ingin git stash apply --index
, tetapi tidak lagi memungkinkan untuk menerapkan simpanan simpanan dengan --index
, karena cabang telah menyimpang terlalu banyak sejak saat Anda menyimpannya.
Ini untuk apa git stash branch
.
Jika kamu:
- lihat komit yang tepat saat Anda melakukan yang asli
stash
, lalu
- buat cabang baru, dan akhirnya
git stash apply --index
upaya untuk membuat kembali perubahan pasti akan berhasil. Inilah yang dilakukan. (Dan kemudian menjatuhkan simpanan sejak itu berhasil diterapkan.)git stash branch newbranch
Beberapa kata terakhir tentang --index
(apa sih itu?)
Apa yang --index
dilakukannya mudah untuk dijelaskan, tetapi sedikit rumit secara internal:
- Ketika Anda memiliki perubahan, Anda harus
git add
(atau "panggung") sebelum commit
.
- Jadi, ketika Anda berlari
git stash
, Anda mungkin telah mengedit kedua file foo
dan zorg
, tetapi hanya mementaskan salah satu dari itu.
- Jadi ketika Anda meminta untuk mendapatkan simpanan kembali, mungkin lebih baik jika itu
git add
adalah add
hal-hal ed dan bukan git add
hal-hal yang tidak ditambahkan. Artinya, jika Anda add
mengedit foo
tetapi tidak zorg
kembali sebelum Anda melakukannya stash
, mungkin lebih baik untuk memiliki pengaturan yang sama persis. Apa yang dipentaskan, harus dipentaskan lagi; apa yang diubah tetapi tidak dipentaskan, harus dimodifikasi lagi tetapi tidak dipentaskan.
The --index
bendera untuk apply
mencoba hal-hal mengatur cara ini. Jika pohon kerja Anda bersih, ini biasanya hanya berfungsi. Jika pohon kerja Anda sudah memiliki beberapa hal add
, Anda dapat melihat bagaimana mungkin ada beberapa masalah di sini. Jika Anda keluar --index
, apply
operasi tidak mencoba untuk mempertahankan seluruh pengaturan bertahap / tidak bertahap. Sebagai gantinya, ia hanya memanggil mesin git's git, menggunakan komit pohon kerja di "kantong simpanan" . Jika Anda tidak peduli tentang mempertahankan staged / unstaged, meninggalkan --index
membuat lebih mudah untuk git stash apply
melakukan hal itu.