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

Недавно я «перескочил» с mercurial (который до сих пор считаю более удобным и логичным) на git, потому что, подавляющее большинство проектов, которые мне интересны, используют git и хостятся на github. В связи с этим, встал вопрос о пересмотре арсенала инструментов, в частности вопрос выбора инструмента визуального сравнения и слияния (diff and merge). Дабы восполнить недостаток информации на хабре, я решил написать этот мини-обзор. Как говориться — по горячим следам.
Под катом Вы также найдете примеры настроек Git для использования с DiffMerge и WinMerge под Windows. Думаю многим сэкономит время.
В принципе, все перечисленные инструменты хорошо справляются со своими задачами и данный обзор не тема для спора, т.к. каждый выбирает инструмент по вкусу.
Далее приводятся примеры настроек Git для работы с DiffMerge и WinMerge. По аналогии можно настроить взаимодействие Git с другими инструментами.
1) Добавим в директорию c:/Git/libexec/git-core/mergetools/
файл diffmerge следующего содержания:
2) Теперь добавим в файл c:/Users/swipe/.gitconfig
следующие строки:
3) Создадим конфликт и вызовем DiffMerge для его разрешения



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

В среднем окне, приведем файл к требуемому состоянию и сохраним изменения.
Конфликт разрешен.
Настройку DiffMegre подсмотрел тут:
http://twobitlabs.com/2011/08/install-diffmerge-git-mac-os-x/
1) Добавим в директорию c:/Git/libexec/git-core/mergetools/
файл winmerge следующего содержания:
Когда Git не может автоматически объединить изменения, происходит конфликт слияния и в конфликтующий файл добавляются маркеры слияния (<<<<<<<, =======, и >>>>>>>). Они необходимы для разрешения конфликта с помощью сторонних инструментов.
Рассмотрим файл readme.txt который образуется в результате выполнения слияния веток master и new в приведенном выше примере:
Мы можем открыть файл конфликтов с помощью программы WinMerge для разрешения конфликта.

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

Исходя из описанной логики перепишем команду слияния merge_cmd следующим образом:
По сути, оба приведенных варианта эквивалентны.
2) Отредактируем .gitconfig
последняя строчка отменяет сохранение backup-файлов в директории репозитория.
3) Создадим конфликт при слиянии двух веток (см. пример с использованием DiffMerge).

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

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

Недавно я «перескочил» с mercurial (который до сих пор считаю более удобным и логичным) на git, потому что, подавляющее большинство проектов, которые мне интересны, используют git и хостятся на github. В связи с этим, встал вопрос о пересмотре арсенала инструментов, в частности вопрос выбора инструмента визуального сравнения и слияния (diff and merge). Дабы восполнить недостаток информации на хабре, я решил написать этот мини-обзор. Как говориться — по горячим следам.
Под катом Вы также найдете примеры настроек Git для использования с DiffMerge и WinMerge под Windows. Думаю многим сэкономит время.
| Название | Особенности | Платформа |
KDiff3http://kdiff3.sourceforge.net/ [скриншот] |
С этим инструментом скорее всего сталкивались как пользователи git, так и пользователи системы mercurial, тем не менее пару строк не помешает. Плюсы:
Минусы:
Примечание: устанавливается вместе с TortoiseHg. |
Windows, Mac OS X, Linux |
DiffMergehttp://www.sourcegear.com/diffmerge/index.html [скриншот] |
Плюсы:
Минусы:
|
Windows, Mac OS X, Linux |
WinMergehttp://www.winmerge.org http://ru.wikipedia.org/wiki/Winmerge [скриншот] |
Плюсы:
Минусы:
Примечание: этим инструментом я начал пользоваться очень давно (еще до того, как стал использовать mercurial и git) и тот факт, что инструмент слияния является двусторонним в большинстве случаев не доставляет особых неудобств. |
Windows |
Meldhttp://meld.sourceforge.net/ [скриншот] |
Плюсы:
Минусы:
|
Windows, Mac OS X, Linux Инструкция по установке под Windows: https://live.gnome.org/Meld/Windows |
Diffusehttp://diffuse.sourceforge.net/ [скриншот] |
Плюсы:
Минусы:
Примечаие: при слиянии с помощью команды git mergetool через Git Bash под Windows открывается четвертое — «лишнее» окно. Убрать можно, подправив конфиг c:/Git/libexec/git-core/mergetools/diffuse |
Windows, Mac OS X, Linux Примечание: при установке под Windows уже включает в себя все зависимости (в отличие от Meld), а именно Python и пакет PyGTK. |
TKDiffhttp://sourceforge.net/projects/tkdiff/ [скриншот] |
Плюсы:
Минусы:
|
Windows, Mac OS X, Linux |
SmartSynchronizehttp://www.syntevo.com/smartsynchronize/index.html [скриншот] |
Плюсы:
Минусы:
Примечание: SmartySynctonize встроен в программу SmartGit — удобный GUI-инструмент для работы с Git (тоже бесплатен для некоммерческого использования). |
Windows, Mac OS X, Linux |
BeyondComparehttp://www.scootersoftware.com/ http://en.wikipedia.org/wiki/Beyond_Compare [скриншот] |
Плюсы:
Минусы:
|
Windows, Linux |
Araxis Mergehttp://www.araxis.com/merge/ [скриншот] |
Плюсы:
Минусы:
Примечание: в комментариях многие расхваливают и советуют этот инструмент, несмотря на высокую стоимость. |
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 // посмотрим на дерево

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

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

Выводится сообщение о конфликте слияния, чего мы и добивались.
git mergetool // разрешим этот конфликт

В среднем окне, приведем файл к требуемому состоянию и сохраним изменения.
Конфликт разрешен.
Настройку 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 для разрешения конфликта.

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

Исходя из описанной логики перепишем команду слияния 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 // сравним две ветви

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

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