Понимание конфликта перебазирования против конфликта слияния с примером - PullRequest
1 голос
/ 04 октября 2019

Я пытаюсь найти пример, в котором конфликт перебазирования отличается от от конфликта слияния.

Я понимаю, что означают отдельные термины - ребаз и слияние. Но я не совсем понимаю, как они могут создавать разные конфликты.

Может ли кто-нибудь указать мне правильное направление на примере?

Ответы [ 2 ]

1 голос
/ 04 октября 2019

Вот простой и несколько надуманный пример. Допустим, вы разветвили основную ветвь в соответствии с этой схемой:

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 в основной ветке. Таким образом, произойдет только одно изменение в функции, исходящее из основной ветви, и, скорее всего, конфликта не будет.

Практическое правило для конфликтов слияния при перебазировании или слиянии заключается в том, что в общем случае они не могутбыть таким же. Перебазирование вновь вводит вашу работу (коммиты) поверх новой базы, и каждый повторный коммит может вызвать конфликты слияния. С другой стороны, слияние вводит одну дельту в целевую ветвь одновременно.

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

На практике конфликтные различия обычно должны возникать из-за того, что rebase применяет патчи фиксации по одному, тогда как слияние рассматривает только конечное состояние каждой ветви (а база слияния - последний коммит, общий для ветвей).

Так что, если у вас есть

o --- x <--(master)
 \         
  A - B - C  <-(feature)

и вы хотите объединить feature с master, возможно, o-A патч конфликтует с o-x, хотя o-C патч этого не делает - всамый простой случай, потому что B или C отменяет то, что A сделал. Затем перебазирование создаст конфликты, которых слияние не будет.

Кроме того, возможно, что вы разрешите конфликты для A во время перебазировки, и это изменит ход перебазировки, если применить B иC. Это немного сложнее визуализировать, поскольку это зависит от того, как вы редактируете рабочее дерево во время разрешения конфликта rebaase, но теоретически это может произойти.

Кроме того, есть несколько способов, которыми слияние может привести к другому конечному содержимому, чемперебазироваться. Я полагаю, вы могли бы манипулировать этими сценариями в случаях, когда конфликты различаются.

Почему содержание будет отличаться? Ну, это не должно , и случаи, когда это действительно странные крайние случаи, которые, по моему мнению, возникают из-за rebase, пытающегося быть слишком умным, но независимо от того, что они почти никогда не возникают на практике.

...