Я использую git уже довольно давно, но никогда не понимал, почему возникают конфликты слияния. Я научился решать их быстро, но мне кажется, что непонимание того, почему они происходят, делает меня несчастным. Наиболее распространенное объяснение the same code region was changed by 2 different commits and now git cannot decide which one to pick
имеет смысл только для самых простых случаев.
Чтобы лучше понять, что происходит, я создал простой файл с двумя строками:
a
b
и зафиксировал его (сообщение журнала init, мастер ветки).
Затем я создал ветку feat
из master
и добавил 3-ю строку: c
Затем я создал еще одну ветку feat2
из master
и изменил b
на bb
.
Наконец, я изменил первую строку в master
на ax
.
В результате дерево выглядит так:
$ git tree
* f4c4a9d (feat) add 3rd line: c
| * f050bf8 (feat2) changed 2nd line: b -> bb
|/
| * 244ed21 (HEAD -> master) change 1st line: a -> ax
|/
* 51fca0f init
Если я хочу выбрать или объединить feat
с мастером, он работает нормально, но если я хочу выбрать feat2
, который изменяет вторую строку, он терпит неудачу и не может понять, почему это происходит.