Содержит ли git rebase больше конфликтов, чем git merge?
Правда ли, что git rebase
более подвержен конфликтам, чем git merge
? Я слышал об этом раньше, и это упоминается в этом посте
Я размышляю на основе анекданных здесь, но я подозреваю, что общее беспокойство по поводу перебазирования проистекает из двух основных мест:
- Из-за механики git rebase конфликты слияний встречаются чаще, и, казалось бы, с ними сложнее справиться
Автор не вдавался в подробности, чтобы обосновать это утверждение, но я слышу его не впервые.
Я слышал и понимаю, что из-за повторного воспроизведения коммитов коммитом вы столкнетесь с одним и тем же конфликтом несколько раз, но я никогда не сталкивался с этим. Может быть, поведение rerere
теперь по умолчанию в git rebase
?
Я пытаюсь предложить политику перебазирования в моей команде, но я хочу решить эту проблему, если она точна.
Честно говоря, я ожидал бы иметь одинаковое количество конфликтов, поскольку изменение в обеих ветвях приведет к конфликту, независимо от перебазирования или слияния. Другими словами, конфликт не вызван схождением ветвей в конце, он вызван параллельными изменениями одной и той же линии.
Ответы
Ответ 1
У вас будет больше конфликтов с rebase, если у вас есть несколько коммитов. Это связано с тем, что при переустановке вам придется решать конфликты для каждой фиксации. Это означает, что если вы пытаетесь переустановить ветку, которая составляет 5 коммитов впереди вашего хозяина, и вы ввели конфликт слияния в первом из этих 5 коммитов, вам придется разрешить этот конфликт в каждом из следующих коммитов.
Rebasing часто должен решить проблему выше. Также стоит упомянуть, что если вы хотите сжать до одного коммита, есть более простая стратегия, чем rebase.
Скажем, у вас есть 5 коммитов, которые вы хотите объединить в master, но это только одна функция, которую можно легко описать в одном коммите с описательным сообщением.
git fetch
git merge origin/master
git reset --soft origin/master
git commit
Если вам просто нужна одна фиксация, это проще и выполняется так же, как и перезагрузка.