Потерянный код после перебазирования, в котором происходит сжатие слияния

Это моя текущая структура (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 жалуется, что есть конфликты, и конфликты точно такие же, как и в приведенном выше интерактивном сеансе перебазирования.

Как мне выполнить ребазинг?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
344
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот один из способов сделать это:

  • Беги git rebase -i HEAD~2

  • В сценарии секвенсора должны быть упомянуты C и D:

    Установите C действие на edit, сохраните и закройте

  • Ребаза будет применена C и приостановится.

    На этом этапе запустите git reset --soft MA, а затем git commit (это приведет к сжатию MA..C за один коммит)

  • Теперь приступайте к перебазированию: git rebase --continue

Это как прелесть для меня. Я думаю, что мне следует получать обновления из master и разрешать конфликты, прежде чем объединять в следующий раз.

Minh Nghĩa 19.12.2020 19:38

Другие вопросы по теме