Cara sebaliknya berlaku simpanan?

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 gitkembali` 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.

Mengomentari pertanyaan (2)
Larutan

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 untukgit berlaku-reverse`.

I've telah menemukan ini benar-benar berguna akhir-akhir ini...

Komentar (8)

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.

Komentar (0)
git checkout -f

akan menghapus setiap non-melakukan perubahan.

Komentar (3)

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
Komentar (1)

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!

Komentar (1)

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 '
Komentar (0)

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
}
  1. Membuat simpanan dengan nama (pesan) $ git simpanan simpan "saya stash"
  2. Untuk appply bernama $ menerapkan "saya stash"
  3. Untuk menghapus bernama simpanan $ hapus "saya stash"
Komentar (0)

Bagaimana untuk membalikkan menerapkan simpanan?

Terlepas dari apa yang orang lain telah disebutkan, cara termudah adalah pertama melakukan

git reset HEAD

dan kemudian checkout semua perubahan lokal

git checkout . 
Komentar (0)