Недавно я узнал, что при объединении двух веток в git, если есть изменения в двух соседних строках, git объявляет это конфликтом. Например, если файл test.txt
имеет это содержимое:
Line 1: A
Line 2: B
Line 3: C
Line 4: D
и в ветке master
мы меняем это на
Line 1: A
Line 2: B1
Line 3: C
Line 4: D
в то время как в филиале testing
мы меняем это на
Line 1: A
Line 2: B
Line 3: C1
Line 4: D
и затем попытка слиться testing
с master
git объявляет конфликт слияния. Мое наивное ожидание состояло в том, что слияние произойдет без конфликта и приведет к следующему:
Line 1: A
Line 2: B1
Line 3: C1
Line 4: D
Я уверен, что есть веская причина, почему git не сливается таким образом. Может кто-нибудь объяснить эту причину?
Ответы:
Предполагая, что этот фрагмент кода
был изменен в одном филиале в этот
и в другой ветке в эту
тогда я не хотел бы, чтобы мерзавец слился с этим
не тревожа меня.
Чтобы избежать возникновения таких проблем, git обычно отказывается автоматически объединять изменения, затрагивая соседние строки. Это дает вам возможность проверить, будет ли логика программы нарушена или нет.
Этот пример тривиален, но при объединении огромных ветвей риск подобных «логических» конфликтов намного выше. Иногда я бы даже хотел, чтобы контекст был еще больше, чем сейчас.
источник
Это поведение только для мерзавцев?
После обсуждения с коллегой я только что попробовал, и SVN справляется с этим без проблем: вы модифицируете 2 строки.
Возможности слияния нескольких VCS тестируются здесь на базаре, darcs, git и mercurial : https://github.com/mndrix/merge-this
Кажется, только дарки успешно объединяют дело "соседних линий".
Применение смежных изменений к файлам не является сложной проблемой. Я действительно думаю, что это поведение было выбрано специально.
Почему кто-то решил, что изменение соседних строк приводит к конфликту?
Я думаю, что это заставит вас взглянуть на это .
Модификация № 1, о мастере:
Модификация № 2, объединенная из ветки:
После слияния вы не хотите этого:
Видя это поведение как особенность
Вы можете превратить поведение git merging в преимущество. Когда вам нужно сохранить согласованность двух строк, но вы не можете обнаружить их (во время компиляции, в начале ваших тестов или еще), вы можете попробовать присоединиться к ним.
Перепишите это ...:
...к этому:
Итак, когда вы объединяете Modif 1 ...:
... с Modif 2 ...:
..., git создаст конфликт, и вы заставите его взглянуть на него.
источник
Я в основном догадываюсь, но я думаю, что это связано со строкой 2, используемой в качестве контекста для изменения строки 3.
Git не может просто сказать, что «строка с C стала строкой с C1», потому что может быть другая строка с «C», поэтому он говорит: «Строка с C, это сразу после начала файла, строка с A, и линия с B, теперь C1 "
Если «строки с буквой B» больше нет, то часть контекста теряется, и git может только приблизительно сказать, куда должна идти новая строка.
источник
Все остальные ответы здесь являются точными, но для меня это всегда казалось ненужным ограничением.
Как уже говорили другие, в этих случаях вы определенно не захотите, чтобы Git объединял строки без предупреждения.
Но я все еще хотел вариант сделать это автоматически, после предупреждения. Поэтому я написал собственный драйвер git merge, который может интерактивно объединять конфликты в соседних (или отдельных) строках:
Это экономит мне огромное количество времени, так как я управляю проектом, в котором люди часто работают над одними и теми же файлами и проводят рефакторинг большого количества кода.
Скрипт доступен на GitHub под лицензией GPLv3 +. Может быть, вы найдете это полезным:
https://github.com/paulaltin/git-subline-merge
источник