Как отменить применение кошелька?
У меня есть небольшой патч, сохраненный в моем тэге 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