Альтернатива ручному редактированию файлов конфликта слияния

У меня есть несколько десятков файлов, к которым Git добавил маркеры конфликта слияния, но Git не признает наличие конфликта слияния и не открывает инструмент слияния:

 1 <<<<<<< HEAD                                             
 2 <?php
 3 require_once('../auth_header.php');
 4 require_once($_SERVER['DOCUMENT_ROOT'].'/init.php');
 5 
 6 =======
 7 <?
 8 require '../auth_header.php';
 9 
10 >>>>>>> development


$ git mergetool
No files need merging

Сейчас я редактирую эти файлы вручную. Есть ли способ использовать правильный инструмент разрешения конфликтов слияния с файлом, отформатированным, как указано выше? Мне не обязательно нужно сравнение с файлом BASE, просто способ сравнить и выбрать две «стороны» файлов, как показано выше, без ручного стирания разделов и маркеров. Я бы, конечно, предпочел остаться в ВИМе.

Всем испробованным мной инструментам разрешения конфликтов слияния, таким как kdiff3, для сравнения требуется два файла. Похоже, они не поддерживают маркеры конфликта слияния.


person dotancohen    schedule 05.01.2015    source источник
comment
Вы хотите прочитать это: vim.wikia.com/wiki/A_better_Vimdiff_Git_mergetool   -  person Kent    schedule 05.01.2015
comment
На самом деле у меня настроен скрипт diffconflicts, но git все равно возвращает No files need merging. Мне нужен способ открыть один файл с маркерами конфликта.   -  person dotancohen    schedule 05.01.2015
comment
В частности, подключаемый модуль Conflict2Diff, упомянутый в конце вики-страницы.   -  person Ingo Karkat    schedule 05.01.2015
comment
Спасибо Инго. Пожалуйста, опубликуйте этот плагин в качестве ответа, так как он точно решает проблему. Благодарю вас!   -  person dotancohen    schedule 05.01.2015
comment
@dotancohen Вы уверены, что у вас все еще есть конфликт, и эти файлы не являются резервными копиями (имена файлов заканчиваются на .orig)?   -  person musiKk    schedule 05.01.2015
comment
@musiKk: Да, я уверен. Я не уверен, как это произошло, и на самом деле это второй раз, когда это произошло с этим проектом. В обоих случаях мы объединили ветки, которые были объединены с главной веткой много месяцев назад, и было слишком много изменений как в главной, так и в функциональной ветке. Сегодня мы внедряем политику слияния с мастером в начале и в конце рабочего дня.   -  person dotancohen    schedule 05.01.2015
comment
@dotancohen Хорошо, я просто хотел убедиться. Я не припомню, чтобы когда-либо сталкивался с этой конкретной проблемой — даже при больших слияниях.   -  person musiKk    schedule 05.01.2015
comment
Вы уверены, что конфликт не возник в более ранней фиксации? Git не должен пропускать слияние, если есть конфликты слияния. Попробуйте git log -S'<<<<<<' --all, чтобы увидеть, не ввела ли какая-либо фиксация оскорбительные символы.   -  person Joseph K. Strauss    schedule 05.01.2015
comment
@JosephK.Strauss: Спасибо, кажется, вы правы. Эти маркеры конфликта скрываются в коде уже более недели в функциональной ветке, которая не тестировалась. Я поговорю с разработчиком, который их совершил. Благодарю вас!   -  person dotancohen    schedule 05.01.2015


Ответы (2)


Git не будет вставлять эти символы, не сообщив вам о конфликте. Он даже не будет автоматически зафиксирован даже при использовании -rerere-autoupdate, и других конфликтов нет. Это делается для того, чтобы убедиться, что вы знаете о конфликте и разрешили его надлежащим образом.

Конечно, это не означает, что вы не можете «перехитрить» Git и добавить файлы в любом случае с конфликтами. Если вы подозреваете, что это проблема, попробуйте найти, кто сделал это с

git log -S'<<<<<<' --all  
person Joseph K. Strauss    schedule 05.01.2015
comment
Спасибо, вы нашли виновника того, почему эти маркеры конфликта находятся в коде. Тем не менее, мне нужно принять предложение Ingo о плагине VIM для решения проблемы, поскольку это был заданный вопрос. Но спасибо за помощь в поиске первопричины! - person dotancohen; 05.01.2015

плагин ConflictToDiff может разделять (он говорит CVS, но также работает для другие инструменты) конфликтный файл (то есть содержащий <<<<<<<< маркеров) обратно в конфликтующие версии и предлагает команды для их объединения.

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

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

person Ingo Karkat    schedule 09.01.2015