Jawaban:
Ketika saya harus menerapkan perubahan simpanan ke copy pekerjaan kotor, mis. Pop lebih dari satu perubahan dari simpanan, saya menggunakan yang berikut ini:
$ git stash show -p | git apply -3 && git stash drop
Pada dasarnya itu
Saya bertanya-tanya mengapa tidak ada -f
opsi (kekuatan) git stash pop
yang harus tepat berperilaku seperti liner satu di atas.
Sementara itu, Anda mungkin ingin menambahkan one-liner ini sebagai alias git:
$ git config --global --replace-all alias.unstash \
'!git stash show -p | git apply -3 && git stash drop'
$ git unstash
Terima kasih kepada @SamHasler karena menunjukkan -3
parameter yang memungkinkan untuk menyelesaikan konflik secara langsung melalui penggabungan 3 arah.
git stash apply
tidak akan menerapkan perubahan simpanan jika Anda memiliki copy pekerjaan yang kotor. Jadi, Anda bisa melihatnya git stash show -p | git apply
sebagai semacam simpanan paksa yang berlaku.
error: <file> does not match index
untuk setiap file yang dimodifikasi. Namun, solusi lain berhasil.
Saya melakukannya dengan cara ini:
git add -A
git stash apply
dan kemudian (opsional):
git reset
git add -u
, yang seperti -A
kecuali itu tidak menambahkan file yang tidak terlacak.
Anda dapat melakukan ini tanpa harus menyimpan perubahan Anda saat ini dengan mengekspor simpanan yang Anda inginkan sebagai file patch dan menerapkannya secara manual.
Misalnya, Anda ingin menerapkan simpanan @ {0} ke pohon kotor:
Ekspor simpanan @ {0} sebagai tambalan:
git stash show -p stash @ {0}> Stash0.patch
Terapkan perubahan secara manual:
git menerapkan Stash0.patch
Jika langkah kedua gagal, Anda harus mengedit file Stash0.patch untuk memperbaiki kesalahan dan kemudian mencoba git menerapkan lagi.
Bersihkan direktori kerja Anda dengan git reset, lakukan perubahan, atau, jika Anda ingin menyembunyikan perubahan saat ini, cobalah:
simpanan $ git simpan "deskripsi perubahan saat ini" $ git simpanan pop simpanan @ {1}
Ini akan menyembunyikan perubahan saat ini, dan kemudian memunculkan simpanan kedua dari tumpukan simpanan.
Solusi Mathias jelas yang paling dekat dengan pop git - force (dan sungguh, ayolah Git devs, mari kita dapatkan opsi ini!)
Namun, jika Anda ingin melakukan hal yang sama hanya menggunakan perintah git, Anda dapat:
Dengan kata lain, buat komitmen (yang tidak akan kami dorong) dari perubahan Anda saat ini. Sekarang ruang kerja Anda bersih, letakan simpanan Anda. Sekarang, komit simpanan perubahan sebagai amandemen terhadap komit Anda sebelumnya. Setelah melakukannya, Anda sekarang memiliki kedua set perubahan yang digabungkan dalam satu komit ("Fixme"); cukup reset (--soft NOT --hard jadi tidak ada yang benar-benar hilang) checkout Anda ke "satu sebelum komit", dan sekarang Anda memiliki kedua set perubahan, sepenuhnya tidak berkomitmen.
** EDIT * *
Saya baru sadar itu sebenarnya lebih mudah; Anda dapat melewati langkah 3, jadi ...
(Komit perubahan saat ini, matikan perubahan yang disimpan, atur ulang komit pertama untuk menggabungkan kedua set perubahan dalam kondisi tidak berkomitmen.)
Tidak satu pun dari jawaban ini yang benar-benar berfungsi jika Anda menemukan diri Anda dalam situasi ini seperti yang saya lakukan hari ini. Terlepas dari berapa banyak yang git reset --hard
saya lakukan, itu tidak berhasil. Jawaban saya (tidak resmi dengan cara apa pun adalah):
git reflog --all
Saya juga menemukan solusi Mathias Leppich untuk bekerja dengan baik sehingga saya menambahkan alias untuk itu ke global .gitconfig
[alias]
apply-stash-to-dirty-working-tree = !git stash show -p | git apply && git stash drop
Sekarang saya bisa mengetik
git apply-stash-to-dirty-working-tree
yang bekerja bagus untuk saya.
(Jarak tempuh Anda mungkin berbeda pada nama alias yang panjang ini. Tapi saya suka dosis verbositas ketika dilengkapi dengan bash completion.)
Anda dapat menerapkan simpanan ke pohon "kotor" dengan melakukan a git add
untuk membuat perubahan apa pun yang telah Anda buat, sehingga membersihkan pohon. Lalu Anda bisa git stash pop
dan menerapkan perubahan simpanan, tidak ada masalah.
Anda memiliki file yang telah dimodifikasi tetapi tidak dilakukan. Antara:
git reset --hard HEAD (to bring everything back to HEAD)
atau, jika Anda ingin menyimpan perubahan Anda:
git checkout -b new_branch
git add ...
git commit
git checkout -b old_branch
git stash pop
Saya tidak bisa mendapatkan sebagian besar dari ini untuk bekerja; untuk beberapa alasan selalu berpikir saya memiliki perubahan lokal ke file. Saya tidak bisa menerapkan simpanan, tambalan tidak akan berlaku, checkout
dan reset --hard
gagal. Yang akhirnya berhasil adalah menyimpan simpanan sebagai cabang dengan git stash branch tempbranchname
, dan kemudian melakukan penggabungan cabang normal: git checkout master
dan git merge tempbranchname
. Dari http://git-scm.com/book/en/Git-Tools-Stashing :
Jika Anda ingin cara yang lebih mudah untuk menguji perubahan simpanan lagi, Anda dapat menjalankan git stash branch, yang menciptakan cabang baru untuk Anda, memeriksa komit yang Anda gunakan saat menyimpan pekerjaan Anda, mengajukan kembali pekerjaan Anda di sana, dan kemudian menjatuhkan simpanan jika berhasil diterapkan
git stash show -p | git apply
berbeda darigit stash apply
?