- PVSM.RU - https://www.pvsm.ru -
На хабре уже было много статей о распределенных системах управления версиями (DVCS [1]), их сравнений, а также сравнений GUI-клиентов для них. Также были обсуждения плагинов к IDE для работы с git и mercurial. Но практически не было информации об инструментах визуального сравнения и разрешения конфликтов слияния.
Недавно я «перескочил» с mercurial (который до сих пор считаю более удобным и логичным) на git, потому что, подавляющее большинство проектов, которые мне интересны, используют git и хостятся на github. В связи с этим, встал вопрос о пересмотре арсенала инструментов, в частности вопрос выбора инструмента визуального сравнения и слияния (diff and merge). По горячим следам, я решил написать этот мини-обзор.
Под катом Вы также найдете примеры настроек Git для использования с DiffMerge и WinMerge под Windows. Думаю многим сэкономит время.
Название | Особенности | Платформа |
KDiff3http://kdiff3.sourceforge.net/ [2] [скриншот [3]] |
С этим инструментом скорее всего сталкивались как пользователи git, так и пользователи системы mercurial, так что оставлю эту ячейку «без комментариев». Примечание: устанавливается вместе с TortoiseHg. [4] |
Windows, Mac OS X, Linux |
DiffMergehttp://www.sourcegear.com/diffmerge/index.html [5] [скриншот [6]] |
Плюсы:
Минусы:
|
Windows, Mac OS X, Linux |
WinMerge
http://www.winmerge.org [7] [скриншот [9]] |
Плюсы:
Минусы:
Примечание: этим инструментом я начал пользоваться очень давно (еще до того, как стал использовать mercurial и git) и тот факт, что инструмент слияния является двусторонним в большинстве случаев не доставляет особых неудобств. |
Windows |
SmartSynchronizehttp://www.syntevo.com/smartsynchronize/index.html [10] [скриншот [11]] |
Плюсы:
Минусы:
Примечание: SmartySynctonize встроен в программу SmartGit [12] — удобный GUI-инструмент для работы с Git (тоже бесплатен для некоммерческого использования). |
Windows, Mac OS X, Linux |
BeyondCompare
http://www.scootersoftware.com/ [13] [скриншот [15]] |
Плюсы:
Минусы:
|
Windows, Linux |
Meldhttp://meld.sourceforge.net/ [16] [скриншот [17]] |
Данный инструмент я не пробовал в действии, т.к. для установки под Windows требуется установить Python, GTK+, Glib, GtkSourceView, что не каждому понравиться. На официальном сайте сказано о поддержке двустороннего и трехстороннего слияния. Meld распространяется под лицензией GPL v2. |
Windows, Linux Инструкция по установке под Windows: https://live.gnome.org/Meld/Windows [18] |
В принципе, все перечисленные инструменты хорошо справляются со своими задачами и данный обзор не тема для спора, т.к. каждый выбирает инструмент по вкусу.
Далее приводятся примеры настроек Git для работы с DiffMerge и WinMerge. По аналогии можно настроить взаимодействие Git с другими инструментами.
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/ [19]
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 не может автоматически объединить изменения, происходит конфликт слияния и в конфликтующий файл добавляются маркеры слияния (<<<<<<<, =======, и >>>>>>>). Они необходимы для разрешения конфликта с помощью сторонних инструментов.
Рассмотрим файл redme.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 [20]).
git difftool master new // сравним две ветви
Для разрешения конфликта при слиянии веток, воспользуемся командой
git mergetool
Отредактируем наш файл. После сохранения изменений, конфликт будет разрешен.
Настройки WinMerge подсмотрел тут:
http://stackoverflow.com/questions/636253/msys-git-merge-tool-command-options-issue [21]
Автор: vitalyswipe
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/razrabotka/13563
Ссылки в тексте:
[1] DVCS: http://ru.wikipedia.org/wiki/DVCS
[2] http://kdiff3.sourceforge.net/: http://kdiff3.sourceforge.net/
[3] скриншот: http://habrastorage.org/storage2/c3b/9a0/c95/c3b9a0c9517dfd0f23b936ee9155ab80.png
[4] TortoiseHg.: http://ru.wikipedia.org/wiki/TortoiseHg
[5] http://www.sourcegear.com/diffmerge/index.html: http://www.sourcegear.com/diffmerge/index.html
[6] скриншот: http://habrastorage.org/storage2/170/795/08f/17079508fdfe75a5bd35d98d189c684a.png
[7] http://www.winmerge.org: http://www.winmerge.org
[8] http://ru.wikipedia.org/wiki/Winmerge: http://ru.wikipedia.org/wiki/Winmerge
[9] скриншот: http://habrastorage.org/storage2/e97/f4a/7fb/e97f4a7fbb6d402666cfff67985a3939.png
[10] http://www.syntevo.com/smartsynchronize/index.html: http://www.syntevo.com/smartsynchronize/index.html
[11] скриншот: http://habrastorage.org/storage2/ea1/850/0df/ea18500dfefe73954345423adb70b61e.png
[12] SmartGit: http://www.syntevo.com/smartgit/index.html
[13] http://www.scootersoftware.com/: http://www.scootersoftware.com/
[14] http://en.wikipedia.org/wiki/Beyond_Compare: http://en.wikipedia.org/wiki/Beyond_Compare
[15] скриншот: http://habrastorage.org/storage2/312/718/899/3127188994f31320d3ea9d48bee4d702.png
[16] http://meld.sourceforge.net/: http://meld.sourceforge.net/
[17] скриншот: http://habrastorage.org/storage2/f86/c20/09e/f86c2009e9ea4fdc0ab9016df7417579.png
[18] https://live.gnome.org/Meld/Windows: https://live.gnome.org/Meld/Windows
[19] http://twobitlabs.com/2011/08/install-diffmerge-git-mac-os-x/: http://twobitlabs.com/2011/08/install-diffmerge-git-mac-os-x/
[20] DiffMerge: #diffmerge
[21] http://stackoverflow.com/questions/636253/msys-git-merge-tool-command-options-issue: http://stackoverflow.com/questions/636253/msys-git-merge-tool-command-options-issue
Нажмите здесь для печати.