Инструмент разрешения конфликтов Git, учитывающий конфликтные аннотации

Раньше я разрешал конфликты с помощью P4merge. Я нашел его в порядке, но я не обращал внимания на то, как он работает под капотом. До недавнего времени я понял, что он пытается сделать слияние сам по себе. В результате он не показывает те же конфликты, что и git, и это расстроило моего менеджера (например, в let's switch back to clearcaseразочаровании).

Вопрос в следующем: git добавляет аннотации к файлу, который не может слиться, как эти

<<<<<<< HEAD
    this code
=======
    the other code
>>>>>>> feature/branch-name

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

Инструмент должен быть для Linux и желательно бесплатным, но, поскольку организация позаботится о стоимости, его также можно оплатить.


ОБНОВЛЕНИЕ: пробная версия kdiff3

К сожалению, kdiff3также не уважает аннотации. Прежде всего, установка не сработала, но ничего страшного, я изменил .gitconfigна

[mergetool "kdiff3"]
     cmd = /path/to/kdiff3 $BASE $REMOTE $LOCAL -o $MERGED

и это сработало. Но потом kdiff3сообщил следующее:

вывод kdiff3

Не совсем то, что я ожидал: у меня было 4 конфликта, а инструмент говорит, что их 2. Также сообщение Nr of automatically solved conflictsзаставляет меня думать, что kdiff3применяется собственный алгоритм слияния, который противоположен тому, что нам нужно.

По умолчанию kdiff3автоматически разрешает конфликты, основанные только на проблемах с пробелами. Но у вас есть много вариантов для настройки в его настройках, если вы хотите изменить его поведение. См. Stackoverflow.com/a/15813064/6368697 : «если вы действительно хотите отключить автоматическое разрешение, просто добавьте --qall в командную строку kdiff3». Также вы сказали, что у вас есть 4 конфликта, а инструмент говорит о 2, но, не видя того, что вы видите, трудно понять вашу ситуацию и причину несоответствия.
@PatrickMevzek Я не хочу, чтобы kdiff3какой-либо другой инструмент разрешал конфликты самостоятельно . Я хочу, чтобы он учитывал конфликты, которые создает git, а не повторял слияние.
Смотрите мой отредактированный комментарий. Добавить --qall. Из справки: "Не разрешать конфликты автоматически.". Я всегда думал, что это одна из его сильных сторон, поэтому мне не нужно терять время на тривиальные конфликты, но, по крайней мере, у вас есть возможность отключить его. YMMV.

Ответы (2)

kdiff3может справиться с этим. Это универсальный diffинструмент для просмотра и слияния (вы также можете использовать его вне любой системы контроля версий, например, для сравнения содержимого каталогов).

Если вы используете это, gitвы можете иметь это в своем gitconfig:

[mergetool "kdiff3"]
    trustExitCode = false
    keepBackup = false

[merge]
    tool = kdiff3
    conflictstyle = diff3

так что git mergetoolпосле неудачного слияния инструмент автоматически запустится для вас.

kdiff3попытается объединить для вас тривиальные вещи и представит вам окно с 4 панелями для решения нетривиальных вещей на основе gitаннотаций сбоев слияния.

Верхняя строка разделена на 3 области, чтобы показать вам:

  • A = LOCAL: это содержимое файла из вашей локальной ветки.
  • B = BASE: это содержимое файла как общего предка, каким оно было до каких-либо изменений в LOCAL или REMOTE.
  • C = REMOTE: это содержимое файла из ветки, из которой вы объединяете и в свою ветку (как показано в LOCAL)

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

Вы можете выбрать варианты A, B или C, чтобы применить изменения в A, B или C в результирующем слиянии. Или вы можете редактировать вещи самостоятельно в нижнем текстовом редакторе.

Посмотрите на этот скриншот: http://kdiff3.sourceforge.net/doc/screenshots.html#dirmergebigscreenshot

kdiff3является бесплатным программным обеспечением и будет работать везде, где работает KDE. Интерфейс немного устарел, но работает.

Другие варианты:

  • meld, см. http://meldmerge.org/ ; пользовательский интерфейс красивее, kdiff3но я нашел его менее полным для моих нужд
  • если вы посмотрите git-configпод merge.toolключом, вы увидите список программ, которые git знает о разрешении слияний. Это может дать вам идеи о том, что нужно проверить, чтобы найти лучший для вас. На моей установке список такой: araxis, bc, bc3, codecompare, deltawalker, diffmerge, diffuse, ecmerge, emerge, examdiff, gvimdiff, gvimdiff2, gvimdiff3, kdiff3, meld, opendiff, p4merge, , , ,tkdifftortoisemergevimdiffvimdiff2vimdiff3winmergexxdiff
Спасибо за исчерпывающий ответ. Мы пробовали meld, но нас это не устраивало. Мы также пробовали IntelliJслияние с тем же результатом. Я не могу быстро протестировать, kdiff3так как я на RHEL, с Gnome и локальным репозиторием без Qt. Прежде чем я оставлю отзыв, пройдет некоторое время.
Если можете, попробуйте виртуальную машину или контейнер, может быть, хотя бы посмотреть. Или запустите компьютер с каким-нибудь LiveCD дистрибутива, на котором он есть.
Это то, что я сделал в конце концов. Я не хочу проявлять неуважение, но, к сожалению, это -1ответ, хотя я не собираюсь минусовать. kdiff3похоже, не уважает аннотации, скриншот этого не доказывает, и meld также выполняет собственное слияние. Так что, если я что-то не пропустил в kdiff3конфигурации , это неправильный ответ. Хотя я узнал о conflictstyle = diff3том, что я игнорировал до сих пор.
@SteliosAdamantidis Мой опыт kdiff3не совпадает с вашим, извините. Из моего использования он всегда правильно работал с git, выполняя все возможные слияния сам по себе и оставляя мне те, которые слишком сложны для автоматического решения. Также обратите внимание, что мне не нужно было настраивать git так, как вам нужно, поэтому, возможно, у вас совсем другие настройки. Извините, если это не сработает для вас, я надеюсь, что вы получите другие лучшие ответы.

Если вы готовы научиться использовать Emacs или Vim, они предлагают именно то, что вам нужно, благодаря ediff и vimdiff соответственно:

  • графический интерфейс с четким выделением цветом альтернативных версий конфликтов (но без удаления каких-либо маркеров конфликтов Git)
  • сочетания клавиш для легкого перехода от одного конфликта к другому
  • сочетания клавиш для легкого выбора той или иной версии для каждого конфликта

Они не используют никаких алгоритмов: Git делает свою работу. Они просто являются интерфейсами, делающими решение конфликта более приятным.

Чтобы использовать ediff, откройте файл в Emacs и запустите smerge-ediffили настройте Emacs на автоматический запуск. См. этот ответ Emacs Stack Exchange для изображения интерфейса и подробностей о сочетаниях клавиш. Альтернативой является установка пакета magit , который использует ediff magit-ediff.

Чтобы использовать vimdiff, вы можете установить его в качестве инструментов слияния в конфигурации Git. Интерфейс очень похож.