Saya mencoba menerapkan perubahan yang saya sembunyikan sebelumnya git stash pop
dan menerima pesan:
Cannot apply to a dirty working tree, please stage your changes
Ada saran tentang bagaimana menghadapinya?
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 show -p | git apply
berbeda darigit stash apply
?git stash apply
tidak akan menerapkan perubahan simpanan jika Anda memiliki copy pekerjaan yang kotor. Jadi, Anda bisa melihatnyagit 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:
dan kemudian (opsional):
sumber
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.
sumber
Bersihkan direktori kerja Anda dengan git reset, lakukan perubahan, atau, jika Anda ingin menyembunyikan perubahan saat ini, cobalah:
Ini akan menyembunyikan perubahan saat ini, dan kemudian memunculkan simpanan kedua dari tumpukan simpanan.
sumber
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.)
sumber
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
sumber
Saya juga menemukan solusi Mathias Leppich untuk bekerja dengan baik sehingga saya menambahkan alias untuk itu ke global .gitconfig
Sekarang saya bisa mengetik
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.)
sumber
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 bisagit stash pop
dan menerapkan perubahan simpanan, tidak ada masalah.sumber
Anda memiliki file yang telah dimodifikasi tetapi tidak dilakukan. Antara:
atau, jika Anda ingin menyimpan perubahan Anda:
sumber
Saya memiliki masalah yang sama tetapi git tidak mengubah file. Ternyata saya punya file index.lock yang tergeletak di sekitar. Menghapusnya memecahkan masalah.
sumber
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
danreset --hard
gagal. Yang akhirnya berhasil adalah menyimpan simpanan sebagai cabang dengangit stash branch tempbranchname
, dan kemudian melakukan penggabungan cabang normal:git checkout master
dangit merge tempbranchname
. Dari http://git-scm.com/book/en/Git-Tools-Stashing :sumber