2013-05-22 3 views
1

Как указано в названии. Я пробовал искать это, но не нашел для этого объяснений, поэтому я посмотрел документацию kdiff3, которая дала некоторое представление. Ситуация, с которой я сталкиваюсь, - это слияние из одной ветки в другую, получение кучи конфликтов и использование git mergetool для их решения по одному. Что происходит, так это то, что для некоторых файлов при запуске kdiff3 появляется диалоговое окно с конфликтами с автосогласованием и отсутствием конфликтов, поэтому я сохраняю файл и продолжаю.Почему git создает конфликты во время слияния, которые автоматически разрешаются большинством инструментов слияния, таких как kdiff3?

Согласно документации kdiff3, конфликты автоматически разрешаются, если строка была изменена только в одной версии файла. То есть. база такая же, как у локального или удаленного файла, но не для обоих.

Мой вопрос: если мой инструмент слияния может автоматически разрешить это (я пробовал несколько, и все они автоматически разрешают некоторые конфликты), и действительно кажется логичным, что он делает, почему я даже получаю конфликт от git ?

Следующий вопрос: как я могу заставить git автоматически разрешать эти конфликты, прежде чем я даже открою свой инструмент слияния?

Примером может быть:

base: 
line 1 
line 2 
line 3 

local: 
line 1 
line 2 
line 3 

remote: 
line 1 
line abc 
line 3 

Я думаю, что вышеуказанные конфликты в Git, но автоматически решен в kdiff3. Хотя это может быть другой случай, я сделал слияния, которые были автоматически разрешены раньше, не может запомнить точный сценарий, поскольку он автоматически разрешен.

+0

Я не знаком с git, но может быть полезно привести здесь пример, а для людей, знающих этот материал, было бы проще объяснить «почему». – maxim1000

+0

обновленное описание – Coder

+0

Я никогда не видел, чтобы Git обеспечивал поведение, которое вы описываете. Можете ли вы уточнить? Или предоставить сценарий для воспроизведения? –

ответ

1

Может быть несколько причин, но, скорее всего, из-за различий в настройках слияния.

Некоторые примеры различий, которые kdiff3 могут быть настроены игнорировать:

  • белое пространство: пустая строка и строка с четырьмя пробелами
  • комментариев: /* This is the original comment */ и /* This is the modified comment */
  • номера: number_of_diffs = 3 и number_of_diffs = 7

В каждом из этих случаев (и, возможно, много других) kdiff3 может просто игнорировать diff тем самым не имея проблем с слиянием. С другой стороны, Git заставит вас вручную разрешить конфликты.

В вашем примере нет очевидной причины, по которой какой-либо (разумный) инструмент выдает конфликт слияния. Но что, если базовый файл был создан в Linux, в то время как вы редактировали локальный файл в Windows (или наоборот)? Тогда, возможно, окончание строк изменилось бы. Это, вероятно, будет совершенно невидимо для вас, но вызовет конфликт слиянием. Я только попробовал и получил следующий результат:

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

Я тогда гласил:

$ git mergetool 
merge tool candidates: meld opendiff kdiff3 tkdiff xxdiff tortoisemerge gvimdiff diffuse ecmerge p4merge araxis bc3 codecompare emerge vimdiff 
Merging: 
file.txt 

Normal merge conflict for 'file.txt': 
    {local}: modified file 
    {remote}: modified file 
Hit return to start merge resolution tool (kdiff3): 

После удара возвращения, KDiff3 молча слил два файла (я даже не видел его открытым) счастливо разрешая разницу в пробелах.

Возможно, это не совсем то, что происходит в вашем случае, но это настоящий пример того, что Git не смог слить то, что kdiff3 автоматически разрешает просто из-за пробелов.

+0

Спасибо, но в моем случае у меня есть все параметры автоматического слияния, установленные для ручного выбора, и я не вижу никаких выбранных параметров, которые игнорировали бы пробелы и т. Д., Поэтому это не похоже на мою проблему. Также будет конфликт, если только одна сторона изменится, как в моей постановке проблемы, или только в примерах, например, в том, что вы дали с пробелами? – Coder

+0

Я обновил этот ответ в ответ на ваш новый пример. –

Смежные вопросы