Почему не удается 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 с одной строкой, имеющей два возможных значения. Он не может решить, какой из них вам нужен, поэтому он выгружает их обоих и позволяет вам исправить его.