Почему не удается Git слить изменения файла с измененным родителем/мастером?

У меня есть файл с одной строкой. Я создаю ветку и добавляю вторую строку к тому же файлу. Сохраните и передайте ветке. Я возвращаюсь к мастеру. И добавьте другую, вторую строку в файл. Сохраните и передайте мастеру. Итак, теперь есть 3 уникальные строки.

Если я сейчас попытаюсь объединить ветвь назад к хозяину, он столкнется с конфликтом слияния.

Почему can not Git просто объединить каждую строку, одну за другой?

Моя попытка слияния ведет себя примерно так:

PS D:\dev\testing\test1> git merge newbranch
Auto-merging hello.txt
CONFLICT (content): Merge conflict in hello.txt
Automatic merge failed; fix conflicts and then commit the result.
PS D:\dev\testing\test1> git diff
diff --cc hello.txt
index 726eeaf,e48d31a..0000000
--- a/hello.txt
+++ b/hello.txt
@@@ -1,2 -1,2 +1,6 @@@
  This is the first line.
- New line added by master.
 -Added a line in newbranch.
++<<<<<<< HEAD
++New line added by master.
++=======
++Added a line in newbranch.
++>>>>>>> newbranch

Есть ли способ сделать это слот линии автоматически, один за другим?

Ответ 1

Предположим, что файловая ветвь A выглядит так:

First line
Branch A second line

И ветка B выглядит так:

First line
Branch B second line

Когда вы сливаетесь, есть два способа решить проблему. Здесь один из способов:

First line
Branch A second line
Branch B second line

Здесь другой способ:

First line
Branch B second line
Branch A second line

Git не знает, какой из этих двух вариантов вы предпочитаете, или если они даже являются приемлемыми слияниями.

Ответ 2

Существует стратегия git merge, называемая union, которая может быть настроена из конфигурационного файла .gitattributes, который сделает это для вас, но вы не будете контролировать порядок, в котором конфликтующие строки будут входить в объединенный файл и маркеры конфликтов, чтобы указать, где это произошло.

Вы также можете определить пользовательскую стратегию слияния, которая могла бы использовать некоторые специализированные знания о структуре файлов для определения правильного порядка.

Ответ 3

скажем, у вас есть эта строка:

printf(something);

в branchA, вы делаете это:

while(x < 5)
printf(something);

в branchB, вы делаете это:

if(y>10)
printf(something);

Как вы можете объединить это, или, вернее, доверяете ли вы результату слияния, созданного для этого инструментом?

Ответ 4

Я могу рассказать вам, почему он не может объединить эти два - согласно git, строка 2 файла FileA "такая-то и такая", тогда как строка 2 "FileB" - "что-то еще". Следовательно, согласно git, он пытается создать File из FileA и FileB с одной строкой, имеющей два возможных значения. Он не может решить, какой из них вам нужен, поэтому он выгружает их обоих и позволяет вам исправить его.