Undo git stash pop, который приводит к конфликту слиянием

Я начал вносить изменения в свою кодовую базу, не понимая, что я был на ветке старой темы. Чтобы перенести их, я хотел их спрятать, а затем применить их к новой ветке мастера. Я использовал git stash pop для переноса изменений незавершенного производства в эту новую ветку, забыв, что я не вносил новые изменения в master перед созданием новой ветки. Это привело к кучей конфликтов слияния и потере чистой информации о моих изменениях (поскольку я использовал pop).

Как только я воссоздаю новую ветку правильно, как я могу восстановить мои спрятанные изменения, чтобы применить их правильно?

Ответ 1

Как оказалось, Git достаточно умен, чтобы не бросать тайник, если он не применяется чисто. Мне удалось добраться до нужного состояния с помощью следующих шагов:

  1. Чтобы удалить конфликты слияния: git reset HEAD. (обратите внимание на конечную точку)
  2. Чтобы сохранить конфликтующее слияние (на всякий случай): git stash
  3. Чтобы вернуться к мастеру: git checkout master
  4. Чтобы получить последние изменения: git fetch upstream; git merge upstream/master git fetch upstream; git merge upstream/master
  5. Чтобы исправить мою новую ветку: git checkout new-branch; git rebase master git checkout new-branch; git rebase master
  6. Чтобы применить правильные спрятанные изменения (теперь 2-е в стеке): git stash apply [email protected]{1}

Ответ 2

К счастью, git stash pop не меняет stash в случае конфликта!

Так что не о чем беспокоиться, просто очистите ваш код и попробуйте снова.

Скажем, ваша кодовая база раньше была чистой, вы можете вернуться в это состояние с помощью: git checkout -f
Затем сделайте то, что вы забыли, например, git merge missing-branch
После этого просто запустите git stash pop снова, и вы получите тот же самый сундук, который конфликтовал раньше.

Внимание: тайник безопасен, однако незафиксированные изменения в рабочем каталоге - нет. Они могут запутаться.

Ответ 3

Инструкции здесь немного сложнее, поэтому я собираюсь предложить что-то более простое:

  1. git reset HEAD --hard Отменить все изменения в текущей ветки

  2. ... Выполнять посредническую работу по мере необходимости

  3. git stash pop Снова откройте stash позже, когда будете готовы