Если до git stash pop
не было никаких поэтапных изменений, как в вопросе, то должны работать следующие две команды.
git diff --name-only --cached | xargs git checkout --ours HEAD
git ls-tree stash@{0}^3 --name-only | xargs rm
Первая отменяет любые объединения из тайника, успешно или нет.Второй удаляет все неотслеживаемые файлы, представленные в хранилище.
С man git stash
: The working directory must match the index.
На что указывает @DavidG, stash pop
завершится ошибкой, если конфликтуют какие-либо неподготовленные измененные файлы.Таким образом, нам не нужно беспокоиться о том, чтобы разорвать конфликты слияний, а не вернуться к HEAD
.Все оставшиеся измененные файлы затем не связаны с тайником и были изменены до stash pop
. Если произошли поэтапные изменения, мне неясно, можем ли мы полагаться на те же команды, и вы можете попробовать@ Техника Бен Джексона.Предложения приветствуются ..
Вот тестовая установка для всех различных случаев https://gist.github.com/here/4f3af6dafdb4ca15e804
# Result:
# Merge succeeded in m (theirs)
# Conflict in b
# Unstaged in a
# Untracked in c and d
# Goal:
# Reverse changes to successful merge m
# Keep our version in merge conflict b
# Keep our unstaged a
# Keep our untracked d
# Delete stashed untracked c