Saya memiliki patch kecil yang disimpan di simpanan git saya. Saya sudah menerapkannya ke copy pekerjaan saya menggunakan git stash apply
. Sekarang, saya ingin mendukung perubahan itu dengan menerapkan patch secara terbalik (seperti apa yang git revert
akan dilakukan selain melawan simpanan).
Adakah yang tahu bagaimana melakukan ini?
Klarifikasi: Ada perubahan lain dalam copy pekerjaan saya. Kasus khusus saya sulit untuk dijelaskan tetapi Anda dapat membayangkan beberapa kode debugging atau eksperimental yang ada di simpanan. Sekarang sudah tercampur dalam copy pekerjaan saya dengan beberapa perubahan lain dan saya ingin melihat efeknya dengan dan tanpa perubahan dari simpanan.
Ini tidak terlihat seperti simpanan yang mendukung ini saat ini, tetapi git stash apply --reverse
fitur yang bagus.
Jawaban:
Menurut halaman git-simpanan , "Sebuah simpanan diwakili sebagai komit yang pohonnya mencatat status direktori kerja, dan orangtua pertamanya adalah komit
HEAD
ketika simpanan dibuat," dangit stash show -p
memberi kami "perubahan yang dicatat dalam simpanan sebagai perbedaan antara status simpanan dan induk aslinya.Untuk menjaga perubahan Anda yang lain tetap utuh, gunakan
git stash show -p | patch --reverse
seperti berikut ini:Edit:
Perbaikan ringan untuk ini adalah untuk digunakan
git apply
sebagai pengganti tambalan:Atau, Anda juga dapat menggunakan
git apply -R
sebagai singkatan untukgit apply --reverse
.Saya telah menemukan ini sangat berguna belakangan ini ...
sumber
git apply -R
ini merupakan peningkatan, setidaknya bagi saya di kotak windows saya dengan git bash karenapatch --reverse
memiliki masalah untuk menemukan file untuk ditambal (tidak ada petunjuk nyata mengapa alternatifnya bekerja). +1 dan penjelasan yang baik--index
seperti ini sajagit stash show -p | git apply --reverse --index
. Karena Anda tidak lagi perlu menambahkan indeks perubahan yang dikembalikan kembali.git stash show -p | git apply -R -v
dengan pesan:Checking patch messages... error: while searching for: Hello, world Hello again error: patch failed: messages:1
. Apakah Anda tahu apa yang salah?git stash
[save]
membawa status direktori kerja Anda, dan status indeks Anda, dan menyimpannya, menetapkan indeks dan area kerja keHEAD
versi.git stash apply
mengembalikan perubahan itu, jadigit reset --hard
akan menghapusnya lagi.git stash pop
mengembalikan perubahan tersebut dan menghapus perubahan simpanan teratas, sehinggagit stash [save]
akan kembali ke keadaan sebelumnya (pra-pop) dalam kasus ini.sumber
akan menghapus semua perubahan yang tidak dilakukan.
sumber
Halaman manual V1 git memiliki referensi tentang membatalkan penerapan simpanan. Kutipan di bawah ini.
Halaman manual V2 git yang lebih baru tidak termasuk referensi untuk membatalkan penerapan simpanan tetapi di bawah ini masih berfungsi dengan baik
Membatalkan penerapan Stash Dalam beberapa skenario kasus penggunaan, Anda mungkin ingin menerapkan perubahan simpanan, melakukan beberapa pekerjaan, tetapi kemudian membatalkan penerapan perubahan yang awalnya berasal dari simpanan. Git tidak menyediakan simpanan membatalkan perintah, tetapi dimungkinkan untuk mencapai efek dengan hanya mengambil tambalan yang terkait dengan simpanan dan menerapkannya secara terbalik:
Sekali lagi, jika Anda tidak menentukan simpanan, Git mengasumsikan simpanan terbaru:
Anda mungkin ingin membuat alias dan menambahkan perintah simpanan-tidak-berlaku untuk Git Anda. Sebagai contoh:
sumber
Ini sudah lama berakhir, tetapi jika saya menafsirkan masalah dengan benar saya telah menemukan solusi sederhana, perhatikan, ini adalah penjelasan dalam terminologi saya sendiri:
git stash [save]
akan menyimpan perubahan saat ini dan mengatur cabang Anda saat ini ke "kondisi bersih"git stash list
memberikan sesuatu seperti:stash@{0}: On develop: saved testing-stuff
git apply stash@{0}
akan mengatur cabang saat ini seperti sebelumnyastash [save]
git checkout .
Akan menetapkan cabang saat ini sebagai setelahstash [save]
Kode yang disimpan dalam simpanan tidak hilang, dapat ditemukan
git apply stash@{0}
kembali.Bagaimanapun, ini berhasil untuk saya!
sumber
git stash apply --reverse
pertama dan kemudian kembaligit stash apply stash@{x}
seperti yang Anda sebutkan. Bekerja tanpa masalah.Terlepas dari apa yang disebutkan orang lain, cara termudah adalah yang pertama dilakukan
dan kemudian checkout semua perubahan lokal
sumber
Selain jawaban @Greg Bacon, seandainya file biner ditambahkan ke indeks dan merupakan bagian dari simpanan menggunakan
dapat menghasilkan
Menambahkan
--binary
menyelesaikan masalah, tapi sayangnya belum menemukan alasannya.sumber
Anda dapat mengikuti gambar yang saya bagikan untuk melepaskan jika Anda secara tidak sengaja mengetuk simpanan.
sumber
Ini merupakan tambahan untuk jawaban di atas tetapi menambahkan pencarian untuk simpanan git berdasarkan pesan sebagai nomor simpanan dapat berubah ketika simpanan baru disimpan. Saya telah menulis beberapa fungsi bash:
$ git stash save "my stash"
$ apply "my stash"
$ remove "my stash"
sumber