Слияние с "git mergetool"
Я нашел git mergetool удобной утилитой для визуального слияния различий, но то, как я это делаю, кажется действительно странным. По сути, мой процесс выглядит так, когда сообщается о конфликтах:
- Выполнить git mergetool
- В командной строке нажмите Enter, чтобы запустить мой инструмент сравнения (Meld или FileMerge, в зависимости от того, какой компьютер)
- Разрешить конфликты
- Сохраните изменения
- Закройте инструмент сравнения
Если у меня более одного конфликта, промойте, повторите. Да, это я открываю и закрываю свой просмотрщик раз для каждого конфликта в слиянии. Поскольку он запускается из командной строки, его закрытие - единственный известный мне способ сообщить git mergetool, что я разрешил этот конкретный конфликт и что он может перейти к следующему.
Конечно, есть лучший способ, но я понятия не имею. Я помогу, пожалуйста? Этот процесс кажется сумасшедшим неэффективным.
3 ответа
На первый взгляд кажется невозможным повторно использовать сеанс внешнего инструмента сравнения.
git-mergetool
документация четко гласит:
Если пользовательский инструмент слияния правильно указывает на успех разрешения слияния с его кодом выхода, тогда переменная конфигурации
mergetool.<tool>.trustExitCode
может быть установлен в true.
Иначе,git-mergetool
предложит пользователю указать успешное разрешение после выхода из пользовательского инструмента.
Поэтому необходим код выхода (или проверка пользователя после выхода из инструмента сравнения), что подразумевает, что пользователь сначала закроет внешний инструмент сравнения.
Это кажется хорошим стимулом для уменьшения количества конфликтов при каждой попытке слияния / перебазировки;) (независимо от используемого инструмента VCScs)
Замечания:
Два других параметра git external diff tools (" Настройка инструментов сравнения и слияния для Git в Windows" и " Настройка SourceGear DiffMerge с Git") не дают больше надежд, когда дело доходит до закрытия внешнего инструмента diff...
Если выбранный вами mergetool поддерживает открытие файлов в существующем экземпляре, вы можете указать команду в вашем git config:
% git config mergetool.whatever_you_want.cmd 'exec /path/to/merge/tool $LOCAL $MERGED $REMOTE'
% git config merge.tool whatever_you_want
git mergetool
затем выполнит вашу пользовательскую команду и затем предложит вам, был ли файл успешно объединен (вместо просмотра кода выхода).
Пример, который я только что взломал вместе для vimdiff:
% git config mergetool.persistent.cmd 'gvim --remote-tab-silent "+set buftype=nowrite" "$PWD/$BASE" && sleep 1; gvim --remote-send ":split $PWD/$REMOTE<CR>:set buftype=nowrite<CR>:vertical diffsplit $PWD/$MERGED<CR>:vertical diffsplit $PWD/$LOCAL<CR>:set buftype=nowrite<CR><C-W>l"'
Это работает достаточно хорошо, я могу начать использовать его сам!
Проблема для mergetool заключается в том, что он намеренно использует интерфейс командной строки для запуска сеанса слияния, а затем ожидает возврата вызванной команды, чтобы определить, когда пользовательское слияние завершилось.
Большинство инструментов слияния не предоставляют механизм командной строки для запуска сеанса слияния в уже запущенном процессе с возможностью определения, когда разрешение было завершено и было ли оно успешным или нет.
Вполне возможно, что некоторые инструменты слияния могли бы обеспечить эту функциональность с помощью отдельной команды-обертки и какого-то рода IPC, но это было бы чрезвычайно специфично для инструмента и сложным для реализации в универсальной программе mergetool.
Я очень, очень, очень долго искал этот ответ. Теперь я наконец получил это простое решение (на удивление):
слияние.
Это откроет объединение в режиме управления версиями. Таким образом, вы можете разрешать конфликты на вкладках и отмечать их как разрешенные всякий раз, когда вы нажимаете кнопку "Помечено как разрешенное".