Вернуться к предыдущему конфликту во время git rebase - PullRequest
0 голосов
/ 10 октября 2019

Я перебираю ветвь функций на мастер, не в интерактивном режиме: git rebase feature master.

Во время этого процесса возникает ряд конфликтов, и я разрешаю их вручную по одному. Однако в конфликте № 3 я забываю сохранить файл с серией значительных изменений и просто вслепую git add файл, конфликты и все, и git rebase --continue.

Теперь я нахожусь в другом конфликтеи из-за предыдущего конфликта файл выглядит как огромный беспорядок. git rebase предлагает мне --continue, --skip и --abort, и я не хочу делать ничего из этого: я хочу "сделать резервную копию" предыдущего коммита и сохранить изменения, которые я забыл сохранить до«повторное применение» патча на этом этапе ребазинга.

Какой самый простой способ сделать это?

Ответы [ 2 ]

2 голосов
/ 10 октября 2019

Вот что я сделал, чтобы исправить ситуацию, для дальнейшего использования. Этот пост дал некоторые подсказки:

https://stackoverflow.com/a/38959162/586086

  1. Сохранить копию файла, который я забыл сохранить.
  2. git rebase --abort.
  3. Найдите в .git/logs/HEAD коммит SHA, где я облажался. (Они сохраняются даже после прерывания перебазировки.)
  4. git checkout -b recovery SHA.
  5. Сохраните версию файла с разрешенным конфликтом поверх конфликтующей версии (сохранение, которое я пропустил) иgit commit -m "resolve conflicts".
  6. git cherry-pick оставшиеся коммиты перебазирования на recovery. Завершите ребаз (сохранение изменений более тщательно в этот раз:).
  7. git checkout feature и git reset --hard recovery.

Если я сделаю этот процесс выше, будет добавлено "resolve conflicts" совершить выше. Если это имеет значение, я могу избавиться от этого, выполнив git rebase -i поверх master и поместив его в коммит, частью которого он должен был быть.

1 голос
/ 10 октября 2019

К сожалению, это один из случаев, когда Git довольно слаб.

В базовой системе есть вещи, которые облегчили бы «возврат туда, где я был несколько шагов назад» (ну, это было бы просто , даже с интерактивной перебазировкой, если бы Git сохранял листы инструкций перебазирования для выполнения с каждого шага, что не делает, но может сделать довольно легко). Но в коде перебазирования нет ничего, что бы на самом деле этого достигло.

Если вы до сих пор вкладываете много работы в свои коммиты, вы можете прямо сейчас установить название ветки или тега на своем отдельном HEAD:Например,

git tag temp-save

, а затем используйте git rebase --abort для выхода из всей перезагрузки.

В противном случае используйте git rebase --abort для выхода из всей в любом случае перебазируйте.

Затем начните все сначала с git rebase.

Когда вы столкнетесь с конфликтом, который вы уже разрешили, вы можете повторно использовать любой коммит, сделанный вами в вашемранее, теперь прервано, выполните перезагрузку, запустив:

git log temp-save

и найдя коммит, который вы сделали в предыдущем запуске. Используйте:

git reset --hard
git read-tree -u <hash>

- или проще, но я не проверял это:

git read-tree --reset -u <hash>

- с хешем, найденным в выводе temp-save из завершенной ребазы, чтобы загрузить вашИндекс и дерево работ из работы, которую вы сделали ранее, как найдено git log temp-save. Вы можете исправить это дальше, если нужно, и git rebase --continue. Как только вы достигнете точки, с которой вы хотели перемотать, вы можете удалить временную ветку или тег:

git tag -d temp-save

, и коммиты, сделанные вами в первом раунде перебазировки, станут очень трудно найти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...