Почему Git не может изменить файл слияния с измененным родителем / мастером? - PullRequest
7 голосов
/ 07 апреля 2010

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

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

Почему 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

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

Ответы [ 4 ]

12 голосов
/ 07 апреля 2010

Допустим, ветвь файла A выглядит следующим образом:

First line
Branch A's second line

А ветка Б выглядит так:

First line
Branch B's second line

Когда вы объединяетесь, есть два разных способа решить это. Вот один из способов:

First line
Branch A's second line
Branch B's second line

Вот еще один способ:

First line
Branch B's second line
Branch A's second line

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

4 голосов
/ 08 апреля 2010

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

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

2 голосов
/ 07 апреля 2010

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

printf(something);

в ветке А, вы делаете это:

while(x < 5)
printf(something);

в ветке B, вы делаете это:

if(y>10)
printf(something);

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

1 голос
/ 07 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...