Undo git stash pop, который приводит к конфликту слиянием
Я начал вносить изменения в свою кодовую базу, не понимая, что я был на ветке старой темы. Чтобы перенести их, я хотел их спрятать, а затем применить их к новой ветке мастера. Я использовал git stash pop
для переноса изменений незавершенного производства в эту новую ветку, забыв, что я не вносил новые изменения в master перед созданием новой ветки. Это привело к кучей конфликтов слияния и потере чистой информации о моих изменениях (поскольку я использовал pop).
Как только я воссоздаю новую ветку правильно, как я могу восстановить мои спрятанные изменения, чтобы применить их правильно?
Ответы
Ответ 1
Как оказалось, Git достаточно умен, чтобы не бросать тайник, если он не применяется чисто. Мне удалось добраться до нужного состояния с помощью следующих шагов:
- Чтобы удалить конфликты слияния:
git reset HEAD.
(обратите внимание на конечную точку) - Чтобы сохранить конфликтующее слияние (на всякий случай):
git stash
- Чтобы вернуться к мастеру:
git checkout master
- Чтобы получить последние изменения:
git fetch upstream; git merge upstream/master
git fetch upstream; git merge upstream/master
- Чтобы исправить мою новую ветку:
git checkout new-branch; git rebase master
git checkout new-branch; git rebase master
- Чтобы применить правильные спрятанные изменения (теперь 2-е в стеке):
git stash apply [email protected]{1}
Ответ 2
К счастью, git stash pop
не меняет stash в случае конфликта!
Так что не о чем беспокоиться, просто очистите ваш код и попробуйте снова.
Скажем, ваша кодовая база раньше была чистой, вы можете вернуться в это состояние с помощью: git checkout -f
Затем сделайте то, что вы забыли, например, git merge missing-branch
После этого просто запустите git stash pop
снова, и вы получите тот же самый сундук, который конфликтовал раньше.
Внимание: тайник безопасен, однако незафиксированные изменения в рабочем каталоге - нет. Они могут запутаться.
Ответ 3
Инструкции здесь немного сложнее, поэтому я собираюсь предложить что-то более простое:
git reset HEAD --hard
Отменить все изменения в текущей ветки
...
Выполнять посредническую работу по мере необходимости
git stash pop
Снова откройте stash позже, когда будете готовы