Ответы:
Когда мне нужно применить спрятанные изменения к грязной рабочей копии, например, извлечь больше чем один набор изменений из кеша, я использую следующее:
$ 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 apply
не будет применять спрятанные изменения, если у вас есть грязная рабочая копия. Таким образом, вы можете увидеть, git stash show -p | git apply
как применяется какой-то принудительный тайник.
error: <file> does not match index
для каждого измененного файла. Однако другое решение сработало.
Я делаю это таким образом:
git add -A
git stash apply
а затем (опционально):
git reset
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 save "описание текущих изменений" $ git stash pop stash @ {1}
Это сохранит текущие изменения, а затем вытолкнет второй тайник из стека тайников.
Решение Матиаса определенно ближе всего к git stash pop --force (и действительно, давай разработчики Git, давайте уже получим эту опцию!)
Однако, если вы хотите сделать то же самое, используя только команды git, вы можете:
Другими словами, сделайте коммит (который мы никогда не будем продвигать) ваших текущих изменений. Теперь, когда ваше рабочее пространство чистое, вставьте свой тайник. Теперь внесите изменения в тайник в качестве дополнения к вашему предыдущему коммиту. После этого оба набора изменений объединены в один коммит («Fixme»); просто сбросьте (--soft NOT --hard, так что на самом деле ничего не потеряно) вашу проверку на «один до этого коммита», и теперь у вас есть оба набора изменений, совершенно незафиксированные.
** РЕДАКТИРОВАТЬ * *
Я просто понял, что на самом деле это даже проще; Вы можете полностью пропустить шаг 3, так что ...
(Зафиксируйте текущие изменения, извлеките сохраненные изменения, сбросьте первый коммит, чтобы объединить оба набора изменений в незафиксированное состояние.)
Ни один из этих ответов на самом деле не сработает, если вы окажетесь в такой ситуации, как я сделал сегодня. Независимо от того, сколько git reset --hard
я сделал, это ни к чему не привело. Мой ответ (никоим образом не был официальным):
git reflog --all
Я также нашел, что решение Матиаса Леппича прекрасно работает, поэтому я добавил псевдоним для него в свой глобальный .gitconfig
[alias]
apply-stash-to-dirty-working-tree = !git stash show -p | git apply && git stash drop
Теперь я могу просто напечатать
git apply-stash-to-dirty-working-tree
который прекрасно работает для меня.
(Ваш пробег может варьироваться в зависимости от этого длинного псевдонима. Но мне нравится доза многословия, когда речь идет о завершении bash.)
Вы можете применить тайник к «грязному» дереву, выполнив a git add
для внесения любых изменений, которые вы внесли, таким образом очистив дерево. Тогда вы можете git stash pop
и применить скрытые изменения, без проблем.
У вас есть файлы, которые были изменены, но не зафиксированы. Либо:
git reset --hard HEAD (to bring everything back to HEAD)
или, если вы хотите сохранить изменения:
git checkout -b new_branch
git add ...
git commit
git checkout -b old_branch
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 :
Если вам нужен более простой способ снова протестировать сохраненные изменения, вы можете запустить ветку git stash, которая создаст новую ветку для вас, проверит коммит, на котором вы находились, когда вы спрятали свою работу, повторно применила свою работу там, а затем отбросила копить, если оно успешно применяется
git stash show -p | git apply
чемgit stash apply
?