Как отменить применение кошелька?

У меня есть небольшой патч, сохраненный в моем тэге git. Я применил его к моей рабочей копии с помощью git stash apply. Теперь я хотел бы отменить эти изменения, обратившись к патчу (вроде того, что git revert будет делать, но против кошелька).

Кто-нибудь знает, как это сделать?

Уточнение: В моей рабочей копии есть другие изменения. Мой конкретный случай трудно описать, но вы можете представить себе какой-то отладочный или экспериментальный код, который содержится в кошельке. Теперь он смешался в моей рабочей копии с некоторыми другими изменениями, и я хотел бы увидеть эффект с изменениями и без изменений из приставки.

Это не похоже на то, что в настоящее время поддерживается stash, но git stash apply --reverse - хорошая функция.

Ответ 1

В соответствии с git -stash manpage, "Stash представлен как коммит, дерево которого записывает состояние рабочего каталога, и его первый родитель - это фиксация в HEAD при создании stash", а git stash show -p дает нам" изменения, записанные в stash, как разницу между сохраненным состоянием и исходным родителем.

Чтобы сохранить другие изменения, используйте git stash show -p | patch --reverse, как показано ниже:

$ 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:

Лучшим улучшением этого является использование git apply вместо патча:

git stash show -p | git apply --reverse

В качестве альтернативы вы также можете использовать git apply -R как сокращенное обозначение git apply --reverse.

В последнее время я считаю это очень полезным...

Ответ 2

git stash [save] берет ваше рабочее состояние каталога и ваше состояние индекса и задерживает их, устанавливая индекс и рабочую область для HEAD версия.

git stash apply возвращает эти изменения, поэтому git reset --hard удалит их снова.

git stash pop возвращает эти изменения и удаляет верхнее спрятанное изменение, поэтому git stash [save] вернется в предыдущее (pre-pop) состояние в этом случае.

Ответ 3

git checkout -f

удалит любые изменения без фиксации.

Ответ 4

Прямая нарезка с пасты git Он четко сформулирован и даже содержит псевдоним;

Отменить привязку В некоторых сценариях использования, которые вы, возможно, захотите применить спрятанные изменения, выполните некоторую работу, но затем отмените те изменения, которые первоначально были получены из кошелька. Git не предоставляет такую ​​команду unashply stash, но можно добиться эффекта, просто извлекая патч, связанный с приложением, и применяя его в обратном порядке:

$ git stash show -p [email protected]{0} | git apply -R

Опять же, если вы не укажете stash, Git принимает самый последний тайник:

$ git stash show -p | git apply -R

Возможно, вы захотите создать псевдоним и эффективно добавить команду stash-unapply к вашему Git. Например:

$ git config --global alias.stash-unapply '!git stash show -p | git apply -R'
$ git stash apply
$ #... work work work
$ git stash-unapply

Ответ 5

Это долгое время, но если я правильно понимаю проблему, я нашел простое решение, обратите внимание, что это объяснение по моей собственной терминологии:

git stash [save] сохранит текущие изменения и установит текущую ветку в "чистое состояние"

git stash list дает что-то вроде: [email protected]{0}: On develop: saved testing-stuff

git apply [email protected]{0} установит текущую ветвь как до stash [save]

git checkout . Устанавливает текущую ветвь как после stash [save]

Код, который сохраняется в кошельке, не теряется, его можно найти еще раз git apply [email protected]{0}.

Anywhay, это сработало для меня!

Ответ 6

В дополнение к ответу @Greg Bacon, если бинарные файлы были добавлены в индекс и были частью приставки, используя

git stash show -p | git apply --reverse

может привести к

error: cannot apply binary patch to '<YOUR_NEW_FILE>' without full index line
error: <YOUR_NEW_FILE>: patch does not apply

Добавление --binary устраняет проблему, но, к сожалению, пока не выяснено, почему.

 git stash show -p --binary | git apply --reverse