Ответ 1
Подходит ли rebase для вашей ситуации?
Исходя из того, что Feature A
и Feature B
кажутся общими ветвями, я бы сказал, что нет.
Перебазирование - это способ слияния ветвей без коммитов слияния (т.е. Коммитов, имеющих двух или более родителей), делающих его похожим на линейную историю. Лучше всего использовать для объединения локальных веток, то есть веток, которые существуют только в вашем локальном хранилище и не были опубликованы для других людей. Зачем? По крайней мере по двум причинам:
-
Перебазировка изменяет идентификаторы фиксации (т.
SHA-1
хэши их метаданных). Это означает, что после того, как вы отправите переназначенные коммиты в общую ветку, они будут отображаться как абсолютно новые коммиты для всех, кто извлекает их из локального репо, даже если они все еще содержат те же изменения. Теперь, если кто-то тем временем добавил новые коммиты поверх старых, им придется их перемещать. Это создает ненужную путаницу. -
Когда вы объединяете публичные ветки, вы часто хотите иметь эти коммиты слияния, чтобы иметь возможность отслеживать, как коммиты перемещались по веткам. Эта информация теряется при перебазировании.
Что происходит под капотом?
Просто регулярное слияние. Разница в том, что git rebase
объединяет один коммит за один раз с предыдущим, начиная с общего родителя. git merge
объединяет два коммита - со всем их набором изменений - как одну операцию, поэтому вам нужно разрешить конфликты только один раз.
Обновление: разрешение повторяющихся конфликтов
Как отметил @Jubobs в комментариях, Git действительно имеет автоматическое решение для разрешения конфликтов, которые возникают несколько раз: git rerere
или "повторно использовать записанное разрешение".
После включения rerere в файле конфигурации (rerere.enabled true
) каждый раз, когда возникает конфликт слияния, Git будет записывать состояние конфликтующих файлов до и после их слияния. В следующий раз, когда возникнет тот же конфликт - конфликт с одинаковыми строками по обе стороны от слияния - Git автоматически применит то же разрешение, которое было записано ранее. Он также сообщит вам об этом в выводе слияния:
КОНФЛИКТ (содержание): конфликт слияния в 'somefile'
Разрешено "somefile" с использованием предыдущего разрешения.
Здесь вы можете найти более подробную информацию о том, как бороться с конфликтами, используя git rerere
.