Saya memiliki sebuah patch kecil yang disimpan di my git simpanan. I've diterapkan untuk kerja saya copy menggunakan git simpanan menerapkan. Sekarang, aku'd ingin kembali perubahan tersebut dengan reverse menerapkan patch (semacam seperti apa git
kembali` akan dilakukan, tetapi terhadap simpanan).
Tidak ada yang tahu bagaimana untuk melakukan hal ini?
Klarifikasi: Ada perubahan lain dalam kerja saya copy. Saya kasus tertentu sulit untuk menggambarkan, tapi anda bisa bayangkan beberapa debugging atau eksperimental kode yang's dalam simpanan. Sekarang ini's dicampur dalam kerja saya copy dengan beberapa perubahan lainnya dan I'd ingin melihat efek dengan dan tanpa perubahan dari simpanan.
Itu doesn't terlihat seperti simpanan mendukung ini saat ini, tapi git simpanan menerapkan --terbalik
akan menjadi fitur yang bagus.
Menurut git-menyimpan halaman manual, "stash adalah direpresentasikan sebagai komit dan pohon catatan keadaan direktori kerja, dan orang tua adalah melakukan di KEPALA
ketika simpanan diciptakan," dan git simpanan show-p
memberi kita "perubahan yang tercatat dalam simpanan sebagai perbedaan antara disembunyikan negara dan asli orang tua.
Untuk menjaga perubahan-perubahan yang lain utuh, menggunakan git simpanan show-p | patch-reverse` sebagai berikut:
$ git init
Initialized empty Git repository in /tmp/repo/.git/
$ echo Hello, world >messages
$ git add messages
$ git commit -am 'Initial commit'
[master (root-commit)]: created 1ff2478: "Initial commit"
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 messages
$ echo Hello again >>messages
$ git stash
$ git status
# On branch master
nothing to commit (working directory clean)
$ git stash apply
# On branch master
# Changed but not updated:
# (use "git add <File>..." to update what will be committed)
# (use "git checkout -- <File>..." to discard changes in working directory)
#
# modified: messages
#
no changes added to commit (use "git add" and/or "git commit -a")
$ echo Howdy all >>messages
$ git diff
diff --git a/messages b/messages
index a5c1966..eade523 100644
--- a/messages
+++ b/messages
@@ -1 +1,3 @@
Hello, world
+Hello again
+Howdy all
$ git stash show -p | patch --reverse
patching file messages
Hunk #1 succeeded at 1 with fuzz 1.
$ git diff
diff --git a/messages b/messages
index a5c1966..364fc91 100644
--- a/messages
+++ b/messages
@@ -1 +1,2 @@
Hello, world
+Howdy all
Edit:
Cahaya perbaikan untuk hal ini adalah dengan menggunakan git apply
di tempat patch:
git stash show -p | git apply --reverse
Atau, anda juga dapat menggunakan git berlaku-Rsebagai singkatan untuk
git berlaku-reverse`.
I've telah menemukan ini benar-benar berguna akhir-akhir ini...
gitsimpanan
[save]
mengambil direktori kerja anda negara, dan indeks negara, dan stash mereka pergi, pengaturan indeks dan area kerja untuk KEPALA
versi.
git simpanan menerapkan
membawa kembali perubahan-perubahan tersebut, sehingga git reset --hard
akan menghapusnya lagi.
git simpanan pop
membawa kembali perubahan-perubahan dan menghilangkan beberapa disembunyikan perubahan, sehingga git simpanan [save]
akan kembali ke sebelumnya (pre-pop) negara dalam kasus ini.
Langsung cut n paste dari git halaman It's jelas worded dan bahkan termasuk alias;
Un-menerapkan Simpanan Dalam beberapa kasus penggunaan skenario anda mungkin ingin menerapkan disembunyikan perubahan, melakukan beberapa pekerjaan, tetapi kemudian un-menerapkan perubahan-perubahan yang berasal dari simpanan. Git tidak memberikan seperti simpanan unapply perintah, tapi itu adalah mungkin untuk mencapai efek dengan hanya mengambil patch yang berhubungan dengan simpanan dan menerapkannya secara terbalik:
$ git stash show -p stash@{0} | git apply -R
Sekali lagi, jika anda tidak menentukan simpanan, Git mengasumsikan terbaru stash:
$ git stash show -p | git apply -R
Anda mungkin ingin membuat alias dan efektif menambah simpanan-unapply perintah untuk Git. Misalnya:
$ git config --global alias.stash-unapply '!git stash show -p | git apply -R'
$ git stash apply
$ #... work work work
$ git stash-unapply
Ini adalah lama berakhir karena, tapi jika saya menafsirkan masalah dengan benar saya telah menemukan solusi yang sederhana, catatan, ini adalah penjelasan saya sendiri terminologi:
git simpanan [save]
akan menyimpan berbagai perubahan saat ini dan mengatur arus cabang ke "negara"
git menyimpan daftar
memberikan sesuatu seperti: simpanan@{0}: Pada mengembangkan: disimpan pengujian-barang
git menerapkan simpanan@{0}
akan mengatur arus cabang sebelum simpanan [save]
git checkout .
Akan mengatur arus cabang setelah simpanan [save]
Kode yang disimpan dalam simpanan tidak hilang, hal ini dapat ditemukan oleh git menerapkan simpanan@{0}
lagi.
Anywhay, ini bekerja untuk saya!
Selain @Greg Daging jawaban, dalam kasus biner file yang ditambahkan ke indeks dan merupakan bagian dari simpanan menggunakan
git stash show -p | git apply --reverse
dapat mengakibatkan
error: cannot apply binary patch to '<YOUR_NEW_File>' without full index line
error: <YOUR_NEW_File>: patch does not apply
Menambahkan --binary
menyelesaikan masalah, tapi sayangnya belum't tahu mengapa belum.
git stash show -p --binary | git apply --reverse
Hal ini selain untuk jawaban atas tetapi menambahkan pencarian untuk git simpanan berdasarkan pesan sebagai simpanan nomor dapat berubah ketika baru stash diselamatkan. Saya telah menulis beberapa bash fungsi:
apply(){
if [ "$1" ]; then
git stash apply `git stash list | grep -oPm1 "(.*)(?=:.*:.*$1.*)"`
fi
}
remove(){
if [ "$1" ]; then
git stash show -p `git stash list | grep -oPm1 "(.*)(?=:.*:.*$1.*)"` | git apply -R
git status
fi
}
$ git simpanan simpan "saya stash"
$ menerapkan "saya stash"
$ hapus "saya stash"