2009-06-19 2 views
154

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

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

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

Это не похоже на то, что этот режим поддерживает этот режим, но git stash apply --reverse будет приятной особенностью.

+0

Есть ли изменения в рабочем дереве, кроме приложенного шкафа? –

+0

Нельзя просто создать обратный патч, если сравнивать текущую и предыдущую ревизию? А затем примените это? – ralphtheninja

ответ

139

Согласно git-stash manpage, «тайник представлен в виде фиксации которого дерево записывает состояние рабочего каталога, и его первый родитель коммита в HEAD, когда был создан тайник» и git stash show -p дает нам «изменения записано в заначке как дифф между прятали государства и его первоначального родителя

Чтобы сохранить другие изменения нетронутыми, используйте 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

Удивительный, спасибо. Похоже, это может быть приятной особенностью для прикрытия. –

+5

Да, 'git apply -R' - это улучшение, по крайней мере для меня на моем окне с git bash, поскольку' patch -reverse' имел проблемы с поиском файла для исправления (нет реального понятия, почему альтернатива работала).+1 и хорошее объяснение – hakre

+0

не было бы лучше добавить '--index' так же, как это' git stash show -p | git apply --reverse --index'. Поскольку вам больше не нужно добавлять в индекс изменения, которые возвращаются обратно. – theUnknown777

61

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

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

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

11

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

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, это сработало для меня!

+0

Чтобы быть уверенным, я применил приложение git stash - -reverse' сначала, а затем просто вернулась в git stash apply stash @ {x} ', как вы упомянули. Работал без проблем. –

16

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

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

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

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

$ git stash show -p | git apply -R 

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

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

приведет к удалению без фиксации изменений.

+1

спасибо, вы поможете мне в поэтапном изменении, которое не было неприемлемым. –

0

В дополнение к @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 
Смежные вопросы