Вот простой и несколько надуманный пример. Допустим, вы разветвили основную ветвь в соответствии с этой схемой:
main: .. A -- D
\
feature: B -- C
И у вас есть функция в определенном файле исходного кода:
function foo() {
int a = 3;
return a;
}
Допустим, что для любогопричина, по которой вы решили добавить одну строку в коммите B:
function foo() {
int a = 3;
int b = 10;
return a;
}
Во втором коммите C вы удалили добавленную строку, оставив код таким же, каким он был при переходе от основной ветви.
В то же время, в основной ветке кто-то еще сделал новый коммит D, который также добавил новую строку:
function foo() {
int a = 3;
int c = 5;
return a;
}
Если вы должны были перебазировать свою ветвь функций на основнойветвь, код начинался бы выше со строки int c = 5
в коммите D. Но затем повторное применение вашего первого коммита B вызовет конфликт слияния, поскольку каждый из двух родителей попытался добавить новую строку в одно и то же место в одной и той же функции. Вы разрешите этот конфликт, а затем выберите любую нужную версию.
Однако , если вместо этого вы объедините основную ветку с вашей веткой, будетнет конфликтов. Причина этого заключается в том, что ваша ветвь компонентов начинается с коммита C, исходный код которого идентичен с коммитом A в основной ветке. Таким образом, произойдет только одно изменение в функции, исходящее из основной ветви, и, скорее всего, конфликта не будет.
Практическое правило для конфликтов слияния при перебазировании или слиянии заключается в том, что в общем случае они не могутбыть таким же. Перебазирование вновь вводит вашу работу (коммиты) поверх новой базы, и каждый повторный коммит может вызвать конфликты слияния. С другой стороны, слияние вводит одну дельту в целевую ветвь одновременно.