Ветки и хирургия

Внешние инструменты сравнения и слияния

Просмотрщик диффов Gitcito и трёхпанельный резолвер справляются с большинством дней. С некоторыми — нет: сгенерированный файл на 4000 строк, слияние, где нужно видеть четыре колонки разом, или просто инструмент, которым вы пользуетесь десять лет и читаете быстрее любого нового.

Настройки → Общие → Внешние инструменты сравнения и слияния.

Это список git, а не наш

Gitcito не держит собственной таблицы. Выпадающие списки — это git difftool --tool-help и git mergetool --tool-help, и отсюда следует вот что:

  • Инструменты, которые git уже нашёл на вашей машине, идут первыми; те, о которых он знает, но найти не может, идут следом с пометкой не установлен.

  • Свой инструмент работает без всякой отдельной поддержки. Если у вас есть

    git config --global difftool.mine.cmd 'mycompare "$LOCAL" "$REMOTE"'
    

    то mine появится в списке наравне со встроенными.

  • Ваш выбор записывается в diff.tool и merge.tool в глобальной конфигурации git — те же самые ключи, которые читает ваш терминал. Задайте здесь — и git difftool в командной строке поведёт себя так же. Задайте там — и Gitcito это подхватит.

Git из коробки знает примерно тридцать инструментов, включая Kaleidoscope, Beyond Compare, Meld, KDiff3, P4Merge, Araxis, DiffMerge, WinMerge, FileMerge, VS Code и семейство vim.

Где появляются действия

Место Действие
Изменённый файл в сборщике коммита Сравнить в <инструменте> — рабочее дерево против индекса
Резолвер конфликтов Слить в <инструменте> — полное трёхстороннее слияние

Оба пункта появляются, только когда инструмент действительно настроен: ненастроенный git difftool просто выдал бы ошибку, а мёртвая кнопка хуже, чем её отсутствие.

Что происходит, пока инструмент открыт

Gitcito ждёт, пока он закроется. Это сделано намеренно — git mergetool индексирует разрешённый файл только после выхода из инструмента, так что докладывать есть о чём только тогда, — и именно поэтому кнопка показывает крутилку, а не возвращается сразу.

Остальное приложение остаётся отзывчивым: эти запуски идут вне поблочной блокировки репозитория, которая упорядочивает обычные операции git, так что инструмент слияния, оставленный открытым на время обеда, не морозит вкладку за собой.

Когда внешнее слияние удалось, git сам индексирует файл, а Gitcito закрывает резолвер и обновляется. Если вы закроете инструмент, не сохранившись, git об этом скажет и ничего не изменится.

Файл .orig

git mergetool по умолчанию оставляет рядом с разрешённым файлом резервную копию <file>.orig — это поведение git, а не Gitcito. Переключатель в настройках пишет mergetool.keepBackup; выключите его — и после разрешённого файла ничего лишнего не остаётся.

Ограничения

  • Только диффы рабочего дерева. Пункт в сборщике коммита сравнивает то, что у вас сейчас, с индексом. Сравнение двух исторических коммитов во внешнем инструменте не подключено — для этого есть встроенный просмотрщик диффов или сравнение.
  • По одному файлу за раз. Прохода «сравнить каждый изменённый файл» нет.
  • Gitcito ничего не устанавливает. Инструмент с пометкой не установлен остаётся выбираемым, потому что git вполне может найти его после установки — но до тех пор он будет падать.

Улучшить этот перевод на GitHub