Как это конфликт - PullRequest
       22

Как это конфликт

3 голосов
/ 18 ноября 2009

Я просто тестирую git, чтобы узнать, смогу ли я использовать его для своей работы. Я столкнулся с проблемой, которая кажется небольшой, но может стать реальной с реальным кодом. Мой файл выглядит так: text.txt 1 2 3 4 У меня есть локальная ветвь "branch1" и зафиксированы изменения как в ветке, так и в master. В мастере я изменил первую строку в ветке на вторую. Таким образом, разница для мастера выглядит следующим образом:

+1 master
 2
 3
 4

Для филиала это:

 1
-2
+2b1
 3
 4

Запуск git merge branch1 разрешает конфликт:

<<<<<<< HEAD
1 master
2
=======
1
2b1
>>>>>>> branch1
3
4

Я знаю, что это можно легко решить. Но как это конфликт, в любом случае. Разве Git не сможет объединить это?

Ответы [ 2 ]

5 голосов
/ 18 ноября 2009

Пара комментариев:

  • Во-первых, такой маленький пример никогда не будет объединен:

    warning: Cannot merge binary files: afile.txt (HEAD vs. abranch)
  • тогда, если у вас есть много «маленьких» конфликтов слияния, которые, как вы знаете, должны быть разрешены независимо от контекста, вы можете попробовать сначала переместить свою ветку поверх master, игнорируя контекст:

    git rebase -C0 master

, а затем объедините вашу ветку в master.

Как правило, - не очень хорошая идея игнорировать весь контекст для перебазирования , но если вы уверены в своих изменениях (как в «модификациях, не требующих контекста вообще») , это будет работать.

из справочной страницы git rebase :

-C<n>

Убедитесь, что по крайней мере <n> строк окружающего контекста совпадают до и после каждого изменения.
Когда существует меньше строк окружающего контекста, все они должны совпадать.
По умолчанию ни один контекст никогда не игнорируется.


Вы можете протестировать его достаточно легко (здесь, в сеансе PowerShell, с Git1.6.5.1, на Xp)

Сначала создайте утилиту для маленькой летучей мыши genfile.bat

echo hello, World %1 > afile.txt
echo hello, World %2 >> afile.txt
echo hello, World 3 >> afile.txt
echo hello, World 4 >> afile.txt
echo hello, World 5 >> afile.txt

затем создайте репо и добавьте файл:

PS D:\git\tests\mergeLines> git init m0
PS D:\git\tests\mergeLines> cd m0
PS D:\[...]\m0> D:\git\tests\mergeLines\genfile.bat 1 2
PS D:\[...]\m0> git add -A
PS D:\[...]\m0> git ci -m "afile to be modified concurrently"

Ваш файл выглядит так:

hello, World 1
hello, World 2
hello, World 3
hello, World 4
hello, World 5

Изменить его в ветке

PS D:\[...]\m0> git co -b abranch
PS D:\[...]\m0> D:\git\tests\mergeLines\genfile.bat 1 2_modified
PS D:\[...]\m0> git ci -a -m "afile modified in abranch"

У вас будет:

hello, World 1
hello, World 2_modified
hello, World 3
hello, World 4
hello, World 5

Затем измените его в мастере

PS D:\[...]\m0> git co master
PS D:\[...]\m0> D:\git\tests\mergeLines\genfile.bat 1_master 2
PS D:\[...]\m0> git ci -a -m "afile modified in master"

Что дает вам:

hello, World 1_master
hello, World 2
hello, World 3
hello, World 4
hello, World 5

Клон этого репо для первого эксперимента (т. Е. Слияние abranch в master)

PS D:\[...]\m0> cd ..
PS D:\git\tests\mergeLines> git clone m0 m1
PS D:\git\tests\mergeLines> cd m1
PS D:\[...]\m1> git co -b abranch origin/abranch
PS D:\[...]\m1> git co master
PS D:\[...]\m1> git merge abranch

Это дает вам конфликт:

Auto-merging afile.txt
CONFLICT (content): Merge conflict in afile.txt
Automatic merge failed; fix conflicts and then commit the result.

PS D:\[...]\m1> type afile.txt
<<<<<<< HEAD
hello, World 1_master 
hello, World 2 
=======
hello, World 1 
hello, World 2_modified 
>>>>>>> abranch
hello, World 3 
hello, World 4 
hello, World 5 

Снова клонируйте первый репо, на этот раз для перебазирования первого abranch поверх master без контекста:

PS D:\[...]\m1> cd ..
PS D:\git\tests\mergeLines> git clone m0 m2
PS D:\git\tests\mergeLines> cd m2
PS D:\[...]\m2> git co -b abranch origin/abranch
PS D:\[...]\m2> git rebase -C0 master

Ваш файл незаметно объединен:

hello, World 1_master
hello, World 2_modified
hello, World 3
hello, World 4
hello, World 5

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

PS D:\git\tests\mergeLines\m2> git co master
Switched to branch 'master'
PS D:\git\tests\mergeLines\m2> git merge abranch
Updating c8f48b4..8bee1d2
Fast forward
 afile.txt |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
4 голосов
/ 18 ноября 2009

Нет контекста, который изолирует два изменения, поэтому неясно, какое должно быть правильное разрешение. С одной строкой контекста изменения: измените блок "1/2" на "1 master / 2" и измените блок "1/2/3" на "1 / 2b1 / 3".

Попытка применить второй «патч» к результату первого патча приводит к ошибке, поскольку контекст, необходимый для успешного применения патча, не совпадает. Патч нуждается в «1/2/3», но имеет «1 мастер / 2/3».

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

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