Обратите внимание, что Git 2.5 (2 квартал 2015 года) будущий Git может попытаться сделать этот сценарий невозможным.
См. коммит ed178ef от Джефф Кинг (peff
), 22 апреля 2015 г.
(Объединено Junio C Hamano - gitster
- в коммит 05c3967 , 19 мая 2015 г.)
Примечание: Это было отменено. Смотри ниже .
stash
: для применения требуется чистый индекс / pop
Проблема
Если вы разместили содержимое в своем индексе и запустили «stash apply/pop
», мы можем столкнуться с конфликтом и добавить новые записи в индекс.
Восстановление в исходное состояние в этот момент затруднено, потому что такие инструменты, как "git reset --keep", сдувают все, что поставлено .
Другими словами:
"git stash pop/apply
" забыл убедиться, что не только чистое рабочее дерево, но и индекс чист.
Последнее важно, поскольку приложение-хранилище может конфликтовать, и индекс будет использоваться для разрешения конфликтов.
Решение
Мы можем сделать это безопаснее, отказавшись от применения при поэтапных изменениях.
Это означает, что если раньше были слияния из-за применения тайника к измененным файлам (добавленным, но не зафиксированным), то теперь они не были бы слияниями, потому что применение / шкатулка остановилось бы немедленно с:
Cannot apply stash: Your index contains uncommitted changes.
Принудительное принятие изменений означает, что в случае слияний вы можете легко восстановить начальное состояние (до git stash apply/pop
) с помощью git reset --hard
.
См. коммит 1937610 (15 июня 2015 г.) и коммит ed178ef (22 апреля 2015 г.) Джефф Кинг (peff
) .
(Объединено с Junio C Hamano - gitster
- в commit bfb539b , 24 июня 2015 г.)
Этот коммит был попыткой повысить безопасность применения
тайник, потому что процесс приложения может создать
конфликтующие записи индекса, после которых трудно восстановить
исходное состояние индекса.
К сожалению, это мешает некоторым распространенным рабочим процессам вокруг "git stash -k
", например:
git add -p ;# (1) stage set of proposed changes
git stash -k ;# (2) get rid of everything else
make test ;# (3) make sure proposal is reasonable
git stash apply ;# (4) restore original working tree
Если вы выполняете git commit между шагами (3) и (4), то это
просто работает. Однако, если эти шаги являются частью предварительной фиксации
крюк, у вас нет такой возможности (вы должны восстановить
исходное состояние независимо от того, пройдены ли тесты или
не удалось).