У меня есть небольшой патч, сохраненный в моем git-хранилище. Я применил его к своей рабочей копии с помощью git stash apply
. Теперь я хотел бы отменить эти изменения, применив патч в обратном порядке (что-то вроде того, что делает git revert
, но в отношении хранилища).
Кто-нибудь знает, как это сделать?
Уточнение: В моей рабочей копии есть и другие изменения. Мой конкретный случай трудно описать, но вы можете представить себе отладочный или экспериментальный код, который находится в тайнике. Теперь он смешан в моей рабочей копии с некоторыми другими изменениями, и я хотел бы увидеть эффект с изменениями из тайника и без них.
Не похоже, что stash поддерживает это в настоящее время, но git stash apply --reverse
было бы хорошей возможностью.
Согласно <a href="http://git-scm.com/docs/git-stash">- manpage git-stash, "Тайник представляется как коммит, дерево которого записывает состояние рабочего каталога, а его первым родителем является коммит в 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
Правка:
Легким улучшением этого является использование git apply
вместо patch:
git stash show -p | git apply --reverse
Также можно использовать git apply -R
как сокращение от git apply --reverse
.
В последнее время я нахожу это очень удобным...
git stash
[save]
берет состояние вашего рабочего каталога и состояние индекса и прячет их, устанавливая индекс и рабочую область в версию HEAD
.
git stash apply
возвращает эти изменения, так что git reset --hard
удалит их снова.
git stash pop
возвращает эти изменения и удаляет верхнее спрятанное изменение, так что git stash [save]
вернется к предыдущему (до открытия) состоянию в этом случае.
Прямой крой вставить N от страница ЖКТ Это'ы четко сформулировано и даже включает в себя псевдоним;
ООН-применение заначку В некоторых случаев применения может потребоваться, чтобы применить спрятал изменения, сделать какую-то работу, а затем применить те изменения, которые изначально пришли из тайника. Git не предоставить такую команду отменить заначку, но можно добиться эффекта путем простого извлечения патча, связанных с набором и применяя его в обратном:
$ git stash show -p stash@{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
Это давно назрело, но если я правильно интерпретирую проблему, я нашел простое решение, обратите внимание, это объяснение в моей собственной терминологии:
git stash [save]
сохранит текущие изменения и установит вашу текущую ветку в "чистое состояние"
git stash list
выдает что-то вроде: stash@{0}: On develop: saved testing-stuff
git apply stash@{0}
установит текущую ветку как before stash [save]
.
git checkout .
установит текущую ветку как after stash [save]
.
Код, сохраненный в тайнике, не потерян, он может быть найден с помощью git apply stash@{0}
снова.
В любом случае, это сработало для меня!
В дополнение к @Грег ответа беконом, в случае, если двоичные файлы были добавлены в индекс и часть заначки, используя
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
Это в дополнение к выше ответы, но добавляет поиск заначку контроля версий Git на сообщение как спрятать номер может измениться, когда новый тайниках сохраняются. Я написал пару функций в bash:
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 тайник$ сэкономить на "заначке"
в$ обращаться на "заначке"
в$ удалить и"заначке"
в