Git перебазировать ветку на старый коммит - PullRequest
2 голосов
/ 10 октября 2019

Примечание: как возникла эта ситуация, больше похоже на рассказ, чем что-либо и не относящееся к действительности IMO.

Учитывая следующий граф git commit, начиная с самого старого, все отправлено в origin

          start
            |
         breaking
       /          \
fix #0             work
    |               |
fix #1(master)     morework(issue-fix)

Мне нужно переместить мою ветку (исправление проблемы) так, чтобы она основывалась на начале, а не на разрыве, то есть превращает ее в

          start
       /         \
breaking            |
    |               |
fix #0             work
    |               |
fix #1(master)     morework(issue-fix)

Изменения в разрыве не связаны с исправлением проблемы (другой части проекта), однако они приводят к сбою CI для этой ветви, так как тестирование охватывает и эту часть проекта.

Я предполагал, что ребаз будет работать, но после проверки дополнительной работы попыталсяв SourceTree ничего не делал, запуск git rebase вручную просто печатает Current branch issue-fix is up to date

Есть ли чистый и эффективный способ сделать это? Я не хочу создавать новую ветку и перемещать все вручную, если мне это не нужно.

РЕДАКТИРОВАТЬ: Кроме того, исправление проблемы было перенесено в другую ветку, тем самым вводя неправильныйсовершает и там. Будет ли там работать тот же процесс, или он будет исправлять эту ветку с исправлением проблем?

Ответы [ 3 ]

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

Вы должны использовать интерактивную перебазировку, чтобы избавиться от коммита breaking из вашей ветви issue-fix.

В вашем случае вам следует зайти в ветку issue-fix и выполнить:

git rebase -i HEAD~3

Тогда, когда редактор открыт, вы сможете выбрать, какие коммиты вы хотите оставить и от которых вы хотите избавиться:

drop 2dsafa ... will delete the commit you want to get rid of
pick sdfsadf .. will leave this commit
pick dfsa4sdc .. will leave this commit

Если ваш issue-fix ветвь уже была объединена с другими ветвями в ее поврежденном состоянии, тогда все становится немного сложнее.

В таком случае я бы предложил использовать интерактивную ребазу, чтобы избавиться от коммитов issue-fix отэти другие ветви. После этого я бы перебазировал коммиты из других веток поверх issue-fix.

1 голос
/ 10 октября 2019
git rebase --onto start work^ issue-fix

Он пытается переместить коммиты с work (входит в комплект) до кончика issue-fix на новую базу start.

Если вы хотите пропустить или раздавить некоторые изфиксирует, используйте интерактивный режим с -i. Интерактивная страница покажет вам, как это сделать.

Если вы хотите сохранить коммиты слияния, вы можете добавить -p. Чтобы сохранить пустые коммиты, используйте --keep-empty.

У вас могут быть другие потребности, не упомянутые в вопросе. Но, скорее всего, вы можете найти правильные опции в руководстве git rebase .

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

Для этого вам нужно запустить интерактивную перебазировку.

В ветке issue-fix Запустить: git rebase --interactive start

Это должно вызвать редактор:

pick breaking <commit message>
pick work <commit message>
pick morework <commit message>

Вы должны изменить «pick» из первой строки на «drop» - то есть вы хотите удалить коммит breaking из вашей ветви и перебазировать его на вершину start. Сохраните и закройте редактор. Запустите git log, чтобы проверить результат.

Как всегда, будьте осторожны, так как перебазировка изменяет хеши коммитов, т.е. даже если коммиты work и morework выглядят одинаковыми, их родителиизменилось бы, в результате чего изменились их соответствующие хеши коммитов. Это потенциально опасно, если issue-fix является общей веткой.

Если вы не уверены, что кто-то уже вытянул вашу ветку issue-fix, я бы выбрал git revert breaking. Это безопасный выбор, который не портит историю веток (он просто добавляет еще один коммит, который «отменяет» breaking).

...