У меня есть небольшой патч, спрятанный в моем git-тайнике. Я применил это к моей рабочей копии, используя git stash apply
. Теперь я хотел бы отменить эти изменения, применив патч в обратном порядке (вроде как то, что git revert
можно сделать, но против тайника).
Кто-нибудь знает как это сделать?
Пояснение: в моей рабочей копии есть другие изменения. Мой конкретный случай трудно описать, но вы можете представить некоторый отладочный или экспериментальный код, который находится в тайнике. Теперь он смешан в моей рабочей копии с некоторыми другими изменениями, и я хотел бы увидеть эффект с изменениями из хранилища и без них.
Не похоже, что stash поддерживает это в настоящее время, но git stash apply --reverse
было бы неплохо.
Ответы:
Согласно man-странице git-stash : «Шкатулка представляется в виде коммита, дерево которого записывает состояние рабочего каталога, а его первый родительский элемент - коммит, в котором
HEAD
был создан тайник», и «git stash show -p
дает нам» изменения, записанные в stash как разница между stashed состоянием и его исходным родителем.Чтобы сохранить другие изменения без изменений, используйте,
git stash show -p | patch --reverse
как показано ниже:Редактировать:
Небольшое улучшение по сравнению с
git apply
патчем:В качестве альтернативы, вы также можете использовать
git apply -R
в качестве краткого обозначенияgit apply --reverse
.Я нашел это очень удобным в последнее время ...
источник
git apply -R
это улучшение, по крайней мере, для меня на моем windows-окне с git bash, так какpatch --reverse
были проблемы с поиском файла для исправления (не знаю, почему альтернатива работала). +1 и хорошее объяснение--index
просто такgit stash show -p | git apply --reverse --index
. Потому что вам больше не нужно добавлять в индекс изменения, которые возвращаются обратно.git stash show -p | git apply -R -v
с сообщением:Checking patch messages... error: while searching for: Hello, world Hello again error: patch failed: messages:1
. Вы знаете, что может быть не так?git stash
[save]
берет ваше рабочее состояние каталога и ваше состояние индекса, и сохраняет их, устанавливая индекс и рабочую область вHEAD
версию.git stash apply
возвращает эти изменения, поэтомуgit reset --hard
удалил бы их снова.git stash pop
возвращает эти изменения и удаляет изменения, сохраненные сверху, поэтомуgit stash [save]
в этом случае вернется в предыдущее (предварительно всплывающее) состояние.источник
удалит все не зафиксированные изменения.
источник
На man-странице V1 git была ссылка о том, как не применять тайник. Выдержка ниже.
Более новая справочная страница V2 git не содержит ссылки на отмену применения тайника, но ниже все еще работает хорошо
Отмена применения тайника В некоторых сценариях использования вы можете применить скрытые изменения, выполнить некоторую работу, но затем отменить те изменения, которые изначально были получены из тайника. Git не предоставляет такой команды stash un-apply, но добиться эффекта можно, просто извлекая патч, связанный с stash, и применяя его в обратном порядке:
Опять же, если вы не указали тайник, Git предполагает самый последний тайник:
Возможно, вы захотите создать псевдоним и эффективно добавить команду stash-unapply в ваш Git. Например:
источник
Это давно закончилось, но если я правильно истолковал проблему, я нашел простое решение, обратите внимание, это объяснение в моей собственной терминологии:
git stash [save]
сохранит текущие изменения и установит текущую ветку в «чистое состояние»git stash list
дает что-то вроде:stash@{0}: On develop: saved testing-stuff
git apply stash@{0}
установит текущую ветку как раньшеstash [save]
git checkout .
Установит текущую ветку как послеstash [save]
Код, который сохраняется в тайнике, не теряется, его можно найти
git apply stash@{0}
снова.В любом случае, это сработало для меня!
источник
git stash apply --reverse
сначала подал заявку, а потом просто вернулся к тому,git stash apply stash@{x}
что вы упомянули. Работал без проблем.Помимо того, что упоминали другие, проще всего сначала сделать
а затем оформить все локальные изменения
источник
В дополнение к ответу @Greg Bacon, в случае, если двоичные файлы были добавлены в индекс и были частью тайника с использованием
может привести к
Добавление
--binary
решает проблему, но, к сожалению, еще не выяснили, почему.источник
Вы можете следить за изображением, которым я поделился, чтобы распаковать, если вы случайно нажали на тайник.
источник
Это в дополнение к вышеупомянутым ответам, но добавляет поиск git stash на основе сообщения, так как номер stash может измениться при сохранении новых stash. Я написал пару функций bash:
$ git stash save "my stash"
$ apply "my stash"
$ remove "my stash"
источник