Обзор инструментов для визуального сравнения и разрешения конфликтов слияния

    На хабре уже было много статей о распределенных системах управления версиями (DVCS), их сравнений, а также сравнений GUI-клиентов для них. Также были обсуждения плагинов к IDE для работы с git и mercurial. Но практически не было информации об инструментах визуального сравнения и разрешения конфликтов слияния.

    diff and merge
    Недавно я «перескочил» с mercurial (который до сих пор считаю более удобным и логичным) на git, потому что, подавляющее большинство проектов, которые мне интересны, используют git и хостятся на github. В связи с этим, встал вопрос о пересмотре арсенала инструментов, в частности вопрос выбора инструмента визуального сравнения и слияния (diff and merge). Дабы восполнить недостаток информации на хабре, я решил написать этот мини-обзор. Как говориться — по горячим следам.

    Под катом Вы также найдете примеры настроек Git для использования с DiffMerge и WinMerge под Windows. Думаю многим сэкономит время.
    Название Особенности Платформа

    KDiff3


    http://kdiff3.sourceforge.net/

    [скриншот]
    С этим инструментом скорее всего сталкивались как пользователи git, так и пользователи системы mercurial, тем не менее пару строк не помешает.

    Плюсы:
    • бесплатен;
    • поддерживает трехстороннее слияние;
    • умеет сравнивать директории;
    • с различными кодировками работает нормально;

    Минусы:
    • без дополнений не подсвечивает синтаксис.


    Примечание: устанавливается вместе с TortoiseHg.
    Windows, Mac OS X, Linux

    DiffMerge


    http://www.sourcegear.com/diffmerge/index.html

    [скриншот]
    Плюсы:
    • бесплатен;
    • поддерживает трехстороннее слияние;
    • умеет сравнивать директории.

    Минусы:
    • бывают проблемы при работе с кириллицей. Думаю, со временем, исправят.
    • DiffMerge по умолчанию, не поддерживает подсветку синтаксиса языков программирования.


    Windows, Mac OS X, Linux

    WinMerge


    http://www.winmerge.org
    http://ru.wikipedia.org/wiki/Winmerge

    [скриншот]
    Плюсы:
    • Open Source;
    • никаких проблем с кодировками;
    • подсветка синтаксиса без лишних телодвижений;
    • сравнение директорий.

    Минусы:
    • инструмент слияния является двусторонним, что может создавать неудобства в некоторых случаях;
    • Windows only.

    Примечание: этим инструментом я начал пользоваться очень давно (еще до того, как стал использовать mercurial и git) и тот факт, что инструмент слияния является двусторонним в большинстве случаев не доставляет особых неудобств.
    Windows

    Meld


    http://meld.sourceforge.net/

    [скриншот]
    Плюсы:
    • GPL v2;
    • двустороннее и трехстороннее слияние файлов;
    • сравнение директорий;
    • подсветка синтаксиса (при установленном GtkSourceView).

    Минусы:
    • для установки под Windows требуется установить Python, GTK+, Glib, GtkSourceView, что не каждому понравиться.

    Windows, Mac OS X, Linux
    Инструкция по установке под Windows:
    https://live.gnome.org/Meld/Windows

    Diffuse


    http://diffuse.sourceforge.net/

    [скриншот]
    Плюсы:
    • GPL;
    • поддержка 2-way, 3-way и n-way (произвольное количество файлов) слияния;
    • подсветка синтаксиса;
    • отлично работает с UTF-8;
    • неограниченная глубина отмен (Undo);
    • удобная навигация по коду.

    Минусы:
    • разве что, невозможность сравнивать директории.

    Примечаие: при слиянии с помощью команды git mergetool через Git Bash под Windows открывается четвертое — «лишнее» окно.
    Убрать можно, подправив конфиг c:/Git/libexec/git-core/mergetools/diffuse
    Windows, Mac OS X, Linux
    Примечание: при установке под Windows уже включает в себя все зависимости (в отличие от Meld), а именно Python и пакет PyGTK.

    TKDiff


    http://sourceforge.net/projects/tkdiff/

    [скриншот]
    Плюсы:
    • GPLv2;
    • можно добавлять закладки для различий;
    • с кодировками работает нормально;

    Минусы:
    • интерфейс менее удобен и выглядит очень бедно (см. скриншот), чем у других продуктов.
    • нет подсветки синтаксиса;
    • не умеет сравнивать директории.

    Windows, Mac OS X, Linux

    SmartSynchronize


    http://www.syntevo.com/smartsynchronize/index.html

    [скриншот]
    Плюсы:
    • трехстороннее слияние;
    • нет проблем с кодировками;
    • помимо файлов, может сравнивать директории.

    Минусы:
    • для коммерческого использования требуется лицензия;
    • подсветка синтаксиса для языков программирования по умолчанию не предусмотрена. Не исключено, что можно как-то сделать.

    Примечание: SmartySynctonize встроен в программу SmartGit — удобный GUI-инструмент для работы с Git (тоже бесплатен для некоммерческого использования).
    Windows, Mac OS X, Linux

    BeyondCompare


    http://www.scootersoftware.com/
    http://en.wikipedia.org/wiki/Beyond_Compare

    [скриншот]
    Плюсы:
    • трехстороннее слияние;
    • может сравнивать файлы, директории, удаленные директории, архивы, а также MP3-файлы, изображения и др. Но последние пункты — это в принципе не нужный функционал.

    Минусы:
    • ShareWare;
    • нет версии под Mac.

    Windows, Linux

    Araxis Merge


    http://www.araxis.com/merge/

    [скриншот]
    Плюсы:
    • трехстороннее слияние;
    • нет проблем с кодировками;
    • подсвечивает синтаксис;
    • помимо файлов, может сравнивать директории и синхронизировать их;
    • хорошо работает на сравнении больших файлов (гигабайты) и больших директорий;
    • генерация отчётов по результатам сравнения.
    • Ribbon-интерфейс (если это можно назвать плюсом).

    Минусы:
    • ShareWare;
    • нет версии под Linux.

    Примечание: в комментариях многие расхваливают и советуют этот инструмент, несмотря на высокую стоимость.
    Windows, Mac OS X

    В принципе, все перечисленные инструменты хорошо справляются со своими задачами и данный обзор не тема для спора, т.к. каждый выбирает инструмент по вкусу.
    Далее приводятся примеры настроек Git для работы с DiffMerge и WinMerge. По аналогии можно настроить взаимодействие Git с другими инструментами.


    Git и DiffMerge


    1) Добавим в директорию c:/Git/libexec/git-core/mergetools/
    файл diffmerge следующего содержания:

    diff_cmd () {
       "c:/Program Files/SourceGear/Common/DiffMerge/sgdm.exe" \
           "$LOCAL" "$REMOTE" >/dev/null 2>&1
    }
    
    merge_cmd () {
       "c:/Program Files/SourceGear/Common/DiffMerge/sgdm.exe" \
       --merge --result="$MERGED" "$LOCAL" "$BASE" "$REMOTE" >/dev/null 2>&1
    
       status=$?
    }
    

    2) Теперь добавим в файл c:/Users/swipe/.gitconfig
    следующие строки:

    [diff]    
       tool = diffmerge
    [merge]
       tool = diffmerge
    [mergetool "diffmerge"]
       cmd = "diffmerge"
       trustExitCode = true
    

    3) Создадим конфликт и вызовем DiffMerge для его разрешения

    git init // инициализируем репозиторий
    создадим пустой файл readme.txt
    git add . // добавим созданный файл в индекс
    git commit -m "empty readme" // зафиксируем изменения
    git branch new // создадим новую ветку
    git checkout new // переключимся на новую ветку
    добавим строку в файл readme.txt
    git add . // добавим изменения в индекс
    git commit -m "new string" // зафиксируем изменения в новой ветке
    git checkout master // переключися на master ветку
    добавим изменения в файл readme.txt
    git add . // добавим изменения в индекс
    git commit -m "master string" // зафиксируем их
    git hist --all // посмотрим на дерево
    

    tree

    git difftool master new // сравним две ветви

    diff

    git merge new // сольем изменения в new с веткой master

    conflict

    Выводится сообщение о конфликте слияния, чего мы и добивались.

    git mergetool // разрешим этот конфликт

    merge

    В среднем окне, приведем файл к требуемому состоянию и сохраним изменения.
    Конфликт разрешен.
    Настройку DiffMegre подсмотрел тут:
    http://twobitlabs.com/2011/08/install-diffmerge-git-mac-os-x/


    Git и WinMerge


    1) Добавим в директорию c:/Git/libexec/git-core/mergetools/
    файл winmerge следующего содержания:

    diff_cmd () {
       "c:/Program Files (x86)/WinMerge/WinMergeU.exe" \
           "$LOCAL" "$REMOTE" >/dev/null 2>&1
    }
    
    merge_cmd () {
       "c:/Program Files (x86)/WinMerge/WinMergeU.exe" \
       "$PWD/$LOCAL" "$PWD/$REMOTE" "$PWD/$MERGED" >/dev/null 2>&1
    
       status=$?
    }
    

    Когда Git не может автоматически объединить изменения, происходит конфликт слияния и в конфликтующий файл добавляются маркеры слияния (<<<<<<<, =======, и >>>>>>>). Они необходимы для разрешения конфликта с помощью сторонних инструментов.
    Рассмотрим файл readme.txt который образуется в результате выполнения слияния веток master и new в приведенном выше примере:

    <<<<<<< HEAD
    master str
    =======
    new str
    >>>>>>> new
    

    Мы можем открыть файл конфликтов с помощью программы WinMerge для разрешения конфликта.

    open

    После этого откроется средство двухстороннего слияния:

    winmerge

    Исходя из описанной логики перепишем команду слияния merge_cmd следующим образом:
    merge_cmd () {
       "c:/Program Files (x86)/WinMerge/WinMergeU.exe" \
           "$MERGED" >/dev/null 2>&1
    
       status=$?
    }
    

    По сути, оба приведенных варианта эквивалентны.

    2) Отредактируем .gitconfig
    [diff]    
       tool = winmerge
    [difftool "winmerge"]
       cmd = "winmerge"
    
    [merge]
       tool = winmerge
    [mergetool "winmerge"]
        cmd = "winmerge"
        trustExitCode = false  
        keepBackup = false
    

    последняя строчка отменяет сохранение backup-файлов в директории репозитория.

    3) Создадим конфликт при слиянии двух веток (см. пример с использованием DiffMerge).
    git difftool master new // сравним две ветви

    windiff

    Для разрешения конфликта при слиянии веток, воспользуемся командой
    git mergetool

    winmerge

    Отредактируем наш файл. После сохранения изменений, конфликт будет разрешен.
    Настройки WinMerge подсмотрел тут:
    http://stackoverflow.com/questions/636253/msys-git-merge-tool-command-options-issue
    Поделиться публикацией

    Похожие публикации

    Комментарии 45
      +8
      Я так понимаю что все эти продукты бесплатные и всё такое, НО, www.araxis.com/merge/ — это почти шедевр, хоть и платен.
        +3
        Всячески поддерживаю, лучше него, по-моему, ничего нет.
          0
          За 5 лет знакомства с ним и попытками найти ему альтернативу — лучшего не нашел. На ворке купили лицензию, хоть юзается не так уж и часто, но когда он нужен — отрабатывает своё бабло на все 200%. Сравнение директорий вообще мало где есть.
            0
            В WinMerge есть сравнение директорий.
              0
              Да, Araxis этим не уникален конечно.
              Но проработанность, интерфейс, скорость работы и ещё 101 мелочь, доведённая до ума уже годами вызывает зависимость не хуже, чем яблочная компания у своих фанатов :)
              Триал у них полноценный, так что можно месяцок поработать и потестить, а там решить уже — стоит ли он своих денег или нет. К тому же не обязательно каждый год его покупать, т.к. глобальных нововведений вроде уже несколько лет как не добавляют (и правильно, универсальный комбаин аля «Nero Express» с него решили не делать), то без апдейтов можно прожить пару лет спокойно. Может вообще обновляться придётся только с следующим поколением OS :)
                0
                Сможет ли кто подсказать, как ОТключить в Meld сравнение файлов по содержимому при сравнении каталогов?
                В 99.99% случаев, (а уж при сравнении бекапов так вообще в 100% случаев) достаточно сравнение по времени изменений и дополнительная проверка на содержимое бессмысленна, но занимает на 99.99% времени больше.

                В TotalCommandere, при сравнении каталогов можно было установить дополнительную галочку…
              0
              meld тоже умеет сравнивать директории
                0
                BeyondCompare тоже неплохо сравнивает директории, не раз выручал
              +1
              спасибо, его тоже попробуем
                +3
                Прочитав статью, сразу подумал «а где же araxis?».

                Дополню от себя:

                Плюсы Araxis Merge:
                трехстороннее слияние;
                нет проблем с кодировками;
                помимо файлов, может сравнивать директории и синхронизировать их;
                хорошо работает на сравнении больших файлов (гигабайты) и больших директорий;
                легко интегрируется с git, mercurial, svn, perforce, vss (omg!);
                интерфейс командной строки;
                генерация отчётов по результатам сравнения в HTML, XML или diff
                работает под Windows и OS X.

                Минусы:
                высокая стоимость: 99EUR за Standart версию, в которой нет трёхстороннего сравнения и автоматического мерджа; 199EUR за Professional (где, соответсвенно, есть всё);
                нет подсветки синтаксиса для языков программирования (или я об этом не знаю?);
                нет версии под Linux.

                Я пару лет назад купил Professional и до сих пор не пожалел.
                  +3
                  нет подсветки синтаксиса для языков программирования (или я об этом не знаю?);
                +1
                Долгое время пользуюсь Beyond Compare. Умеет всё что нужно, даже с запасом. Море настроек, подсветка синтаксиса и прочие плюшки. Единственное, что иногда напрягает — это распознавание кодировки, впрочем переключатель находится на видном месте и легко выбирается нужная кодировка.
                +2
                Спасибо за статью!
                Сам пользуюсь WinMerge, однако, никогда не задумывался о привязке его к git, все ручками делал…
                Кстати, в отличие от старых версий WinMerge сейчас же позволяет сравнивать и файлы, и директории.
                  +1
                  для сравнения директорий мне привычнее использовать Total Commander
                • НЛО прилетело и опубликовало эту надпись здесь
                    0
                    Поддерживаю. Ставить надо не так уж и много. Для Windows:
                    1) Ставим Python 2.6 (или Python 2.7);
                    1.1) Следим, что C:\Python26 (C:\Python27) в переменных окружения;
                    2) Ставим PyGTK All-in-one for Python 2.6 (или PyGTK All-in-one for Python 2.7);
                    3) Забираем meld
                    3.1) Запуск «python bin\meld» из папки meld-1.6.0. Сделать bat для повседневного использования.
                      0
                      У него совсем плохо с нечетким сравнением. А для 3-way вообще почти никакого функционала нет — например забрать слева, потом справа.
                        0
                        meld 1.6.0 — 3-way:
                        Changes\Merge all from left
                        Changes\Merge all from right
                        Changes\Merge all none conflict
                          0
                          А вот последовательгного-то мерджа нету. И нечеткое сравнение.
                            0
                            за-то вы можете добавить ))
                              0
                              Чисто теоретически. Хотя зачем, когда есть другие отличные инструменты? Я вот за столько лет сидения на линуксе, так и не понял, почему сообщество развивает кучу одинаковых инструментов и ни один по настоящему круто, когда можно было бы сконцентрировать усилия на одном и обогнать все, что сделано на других платформах и вообще всех конкурентов.
                      +4
                      А почему в обзоре нет p4merge?
                      Я под Windows все SVN конфликты им разруливаю.
                        +2
                        Невозможно знать о всех существующих решениях. Я как раз рассчитывал, что в комментариях сделают дополнения к основному тексту. Спасибо за ссылку.
                          +1
                          Вполне адекватная кросплатформенная утилита. Я пока на ней остановился.
                            +1
                            самое клевое из того что я пробовал
                            +1
                            Пользуюсь SmartSynchronize. В минусы добавил бы долгую загрузку, особенно при первом использовании (Java, всё-таки). Впрочем, для пользователей с SSD это не такая уж и проблема.
                              +2
                              GitExtensions позволяет удобно сконфигурировать difftool / mergetool в диалоге настроек. Он знает про:
                              — (merge) TortoiseMerge, Araxis, BeyondCompare, DiffMerge, kdiff3, p4merge
                              — (diff) те же + gvimdiff, ..., winmerge

                              Кажется, что незаслуженно забыт TortoiseMerge (идёт вместе с TortoiseSVN/GIT, но также можно скачать его отдельно).

                              Лично я использую
                              — WinMerge для сравнение (когда текстового diff недостаточно)
                              — TortoiseMerge для 3-way merge
                                0
                                Фронтенд TortoiseHg для Mercurial также позволяет подцепить инструменты для сравнения и слияния через меню настроек.
                                +4
                                Встроенный в IDE`шках от JetBrains инструмент очень даже ок.
                                  0
                                  По-моему, намного выше чем ок.
                                  +1
                                  С инструментами для сравнения есть одна беда — нельзя выбрать один для всех задач. Лично я использую kdiff3 в качестве merge tool, мне он кажется самым удобным и понятным. Но вот для сравнения и одновременного редактирования пары файлов kdiff3 подходит плохо, и тут я вынужден запускать уже diffuse.
                                    0
                                    прошу всё-таки чего-нибудь написать про KDiff3 — какого черта я должен был с ним сталкиваться и что-либо о нём знать?
                                      0
                                      Araxis крутой, но настолько платный, что я выбрал diffmerge, который обладает львиной долей функционала (и еще я под линуксом, да).
                                      А еще пропустили diffuse.
                                        0
                                        Подскажите, есть ли инструменты для мержа в консоли (кроме vimdiff)?
                                          0
                                          Пользуюсь AptDiff или WinMerge в зависимости от настроения. Каталоги сравниваю файловым менеджером — привычка.
                                            0
                                            я конечно извиняюсь, но я пользуюсь mcdiff для сравнения и слияния. В сочетании с git вполне удобно…
                                              +1
                                              А у меня на Windows стоит KDiff3, а на Linux конечно же Meld. И от себя добавлю: Meld шикарен!
                                                0
                                                После KDiff3 перестал искать инструменты для этого.
                                                  0
                                                  Мне очень нравится diff в Eclipse.
                                                  Удобнее я не встречал.

                                                  Умеет производить diff как файлов, так и папок.

                                                  Делает diff по:
                                                  — ревизиям файла в CVS
                                                  — локальной истории
                                                  — между произвольными файлами
                                                  — с буфером обмена

                                                  Подсветка синтаксиса.
                                                  Указание в каких методах и/или классах различая.

                                                  Что ещё надо?

                                                  image
                                                    0
                                                    Дополнил статью! Если кто-то обнаружит ошибки, просьба сообщить в личку или иным способом.
                                                      0
                                                      ediff в емаксе
                                                        0
                                                        Можно ещё упомянуть Perforce P4Merge, который тоже поддерживает трехстороннее слияние, сравнение папок и картинок.
                                                        Условно бесплатен.
                                                          0
                                                          Мое общение с kdiff закончилось на попытке найти привычное со времен BC «Compare to»
                                                          Там вообще двухпанельный режим есть? ) Имхо, проще купить BC — 30$, вроде.
                                                            0
                                                            а если ещё стоит задача сравнения папок с файлами то можно глянуть в сторону этой проги. Она позволяет слить информацию о файлах (в данном случае интересны даты, размер и md5) в текстовик или csv, а потом сравнить их любой рассмотренной выше программой.

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

                                                            Самое читаемое