Это моя текущая структура (git log
, но без текста), функциональная ветвь ответвляется от master
:
D <- Keep this
C <- Squash/meld everything before into this
*
ME <- Merge commit
|\
| B
* |
* |
|/
A <- First commit of the feature branch
MA <- master
Я хочу сохранить последний коммит текущей ветки функций D
и сжать/объединить все до него в предпоследний коммит C
, например:
D
C' <- Squash everything before C and C itself
MA
Затем я делаю перебазирование с помощью git rebase -i master
:
Первый коммит A
сохраняется, поэтому я использую pick
. Это станет C'
.
Все, что находится между A
и C
, есть squash
.
Я не вижу коммита слияния ME
, но перечислены все остальные коммиты. В соответствии с этим ТАК, коммит слияния будет иметь все в своей ветке, но с сообщением B
. B
указан, так что все в порядке.
Последний коммит D
сохраняется, так что pick
еще раз.
При перебазировании я вижу много конфликтов. После проверки все конфликты разрешаются путем принятия «входящих изменений», так как они содержат более новый код.
Однако после перебазирования код больше не компилируется, теперь это беспорядок. Я понимаю, что код в коммите слияния ME
потерян. ME
это не тривиальное слияние, мне нужно решить много конфликтов перед слиянием.
Затем я попытался сделать ребаз, в котором я pick
все коммиты. Я думаю, что это должно происходить без каких-либо конфликтов и оставить историю нетронутой (или воссоздать точно такую же историю). Но git жалуется, что есть конфликты, и конфликты точно такие же, как и в приведенном выше интерактивном сеансе перебазирования.
Как мне выполнить ребазинг?
Вот один из способов сделать это:
Беги git rebase -i HEAD~2
В сценарии секвенсора должны быть упомянуты C
и D
:
Установите C
действие на edit
, сохраните и закройте
Ребаза будет применена C
и приостановится.
На этом этапе запустите git reset --soft MA
, а затем git commit
(это приведет к сжатию MA..C
за один коммит)
Теперь приступайте к перебазированию: git rebase --continue
Это как прелесть для меня. Я думаю, что мне следует получать обновления из
master
и разрешать конфликты, прежде чем объединять в следующий раз.