Я пытаюсь применить изменения, которые я спрятал ранее, git stash pop
и получаю сообщение:
Cannot apply to a dirty working tree, please stage your changes
Любое предложение о том, как бороться с этим?
Когда мне нужно применить спрятанные изменения к грязной рабочей копии, например, извлечь больше чем один набор изменений из кеша, я использую следующее:
$ git stash show -p | git apply -3 && git stash drop
В основном это
Интересно, почему нет -f
(принудительного) варианта, для git stash pop
которого должен точно вести себя, как однострочник выше.
Тем временем вы можете добавить этот однострочный псевдоним:
$ git config --global --replace-all alias.unstash \
'!git stash show -p | git apply -3 && git stash drop'
$ git unstash
Спасибо @SamHasler за указание -3
параметра, который позволяет разрешать конфликты напрямую с помощью трехстороннего слияния.
git stash show -p | git apply
чемgit stash apply
?git stash apply
не будет применять спрятанные изменения, если у вас есть грязная рабочая копия. Таким образом, вы можете увидеть,git stash show -p | git apply
как применяется какой-то принудительный тайник.error: <file> does not match index
для каждого измененного файла. Однако другое решение сработало.Я делаю это таким образом:
а затем (опционально):
источник
git add -u
, что похоже на то,-A
что он не добавляет неотслеживаемых файлов.Вы можете сделать это без необходимости сохранять текущие изменения, экспортировав тайник, который вы хотите, в виде файла патча и применив его вручную.
Например, скажем, вы хотите применить stash @ {0} к грязному дереву:
Экспорт stash @ {0} в виде патча:
git stash show -p stash @ {0}> Stash0.patch
Вручную применить изменения:
git apply Stash0.patch
Если второй шаг не удался, вам нужно отредактировать файл Stash0.patch, чтобы исправить все ошибки, а затем снова попробовать git apply.
источник
Либо очистите свой рабочий каталог с помощью git reset, зафиксируйте изменения, либо, если вы хотите сохранить текущие изменения, попробуйте:
Это сохранит текущие изменения, а затем вытолкнет второй тайник из стека тайников.
источник
Решение Матиаса определенно ближе всего к git stash pop --force (и действительно, давай разработчики Git, давайте уже получим эту опцию!)
Однако, если вы хотите сделать то же самое, используя только команды git, вы можете:
Другими словами, сделайте коммит (который мы никогда не будем продвигать) ваших текущих изменений. Теперь, когда ваше рабочее пространство чистое, вставьте свой тайник. Теперь внесите изменения в тайник в качестве дополнения к вашему предыдущему коммиту. После этого оба набора изменений объединены в один коммит («Fixme»); просто сбросьте (--soft NOT --hard, так что на самом деле ничего не потеряно) вашу проверку на «один до этого коммита», и теперь у вас есть оба набора изменений, совершенно незафиксированные.
** РЕДАКТИРОВАТЬ * *
Я просто понял, что на самом деле это даже проще; Вы можете полностью пропустить шаг 3, так что ...
(Зафиксируйте текущие изменения, извлеките сохраненные изменения, сбросьте первый коммит, чтобы объединить оба набора изменений в незафиксированное состояние.)
источник
Ни один из этих ответов на самом деле не сработает, если вы окажетесь в такой ситуации, как я сделал сегодня. Независимо от того, сколько
git reset --hard
я сделал, это ни к чему не привело. Мой ответ (никоим образом не был официальным):git reflog --all
источник
Я также нашел, что решение Матиаса Леппича прекрасно работает, поэтому я добавил псевдоним для него в свой глобальный .gitconfig
Теперь я могу просто напечатать
который прекрасно работает для меня.
(Ваш пробег может варьироваться в зависимости от этого длинного псевдонима. Но мне нравится доза многословия, когда речь идет о завершении bash.)
источник
Вы можете применить тайник к «грязному» дереву, выполнив a
git add
для внесения любых изменений, которые вы внесли, таким образом очистив дерево. Тогда вы можетеgit stash pop
и применить скрытые изменения, без проблем.источник
У вас есть файлы, которые были изменены, но не зафиксированы. Либо:
или, если вы хотите сохранить изменения:
источник
У меня была та же проблема, но у git были ноль измененных файлов. Оказывается, у меня был файл index.lock, который валялся. Удаление это решило проблему.
источник
Я не смог заставить большинство из них работать; по какой-то причине он всегда думает, что у меня есть локальные изменения в файле. Я не могу применить тайник, патчи не будут применены
checkout
иreset --hard
потерпят неудачу. В итоге получилось сохранить сундук как ветку сgit stash branch tempbranchname
последующим обычным слиянием веток:git checkout master
иgit merge tempbranchname
. С http://git-scm.com/book/en/Git-Tools-Stashing :источник