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

521

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

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

acjay
источник

Ответы:

658

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

  1. Чтобы устранить конфликты слияния: git reset HEAD .(обратите внимание на конечную точку)
  2. Чтобы сохранить конфликтующее слияние (на всякий случай): git stash
  3. Чтобы вернуться к мастеру: git checkout master
  4. Чтобы вытащить последние изменения: git fetch upstream; git merge upstream/master
  5. Чтобы исправить мою новую ветку: git checkout new-branch; git rebase master
  6. Чтобы применить правильные спрятанные изменения (теперь 2-е в стеке): git stash apply stash@{1}
acjay
источник
14
Отлично, спасибо! № 6 - это действительно ответ, который я искал. Можно добавить git stash dropкак последний шаг, чтобы избавиться от нежелательного тайника из # 2.
Остинмартон
2
# 2 не будет работать, если есть незакрытые пути, вместо этого он выведет ошибку, описанную здесь: stackoverflow.com/questions/5483213/…
Этьен
5
Не совсем верно - Git сохранит тайник в списке тайников, если его не удалось применить чисто. См. Следующие документы git stash pop: «Применение состояния может привести к сбою при конфликтах; в этом случае оно не удаляется из списка хранилищ. Вам необходимо разрешить конфликты вручную и git stash dropвпоследствии вызвать их вручную». ( git-scm.com/docs/git-stash )
Кэролин Конуэй,
4
Странно , как этот ответ и вопрос размещены на точном ту же минуту
звонок-я
14
@ call-me Я думаю, что люди должны делать это чаще! Обратите внимание, что форма «Задать вопрос» имеет флажок, который позволяет вам ответить на свой вопрос в той же форме :). Это иногда случается со мной, когда я нахожусь в процессе написания вопроса, который вводит меня в заблуждение, но, пытаясь настроить вопрос так, чтобы он подходил для StackOverflow, я в итоге выясняю решение. Это было некоторое время назад, поэтому я не помню, имело ли это место здесь, но я предполагаю, что это случилось.
acjay
342

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

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

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

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

Флори
источник
16
Что я понимаю, так это то, что вы можете просто почистить и всплыть снова, но вы не можете отменить это. Если всплывающее окно смешивается с другими незафиксированными изменениями, то вам придется очистить вручную.
haridsv
Это очень простое решение и отлично сработало для меня. Предполагается, что вы можете отменить все, что изменилось локально (до / после того, как тайник был снят, изменений не было), что, я думаю, работает в большинстве ситуаций. Если вам необходимо сохранить некоторые дополнительные изменения, которые произошли до того, как вы поймете, что это проблема, вы должны иметь возможность зафиксировать эти файлы, прежде чем начинать извлечение в большинстве случаев.
Project707
Это был не тот случай для меня. Я назвал git stash popэто попыткой автоматического слияния, конфликтовал и сохранил это.
Тревор Хикки
1
@TrevorHickey Смысл этого ответа состоял в том, что тайник остается таким же, как и в случае конфликта, который вы можете вызывать git stash popтак часто, как вам нужно, до тех пор, пока он не закончится без конфликта. Так что после вашего конфликта, да, рабочий каталог в беспорядке, однако, вы можете очистить его и вызвать git stash popснова.
Флорида
5
эта команда для отмены последнего применения тайника очень полезна git checkout -f:!
Лефи Тарик
16

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

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

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

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

anon58192932
источник
8
git checkout -f

должен работать, если ваше предыдущее состояние чистое.

Allahbakash.G
источник