Как разрешить множественные конфликты с помощью "git mergetool", не закрывая редактор между файлами?

Я обнаружил, что git mergetool является удобной утилитой для визуального слияния различий, но то, как я это делаю, кажется действительно странным. По сути, мой процесс выглядит так, когда сообщается о конфликтах:

  1. Выполнить git mergetool
  2. В командной строке нажмите Enter, чтобы запустить мой инструмент сравнения (Meld или FileMerge, в зависимости от компьютера)
  3. Разрешить конфликты
  4. Сохраните изменения
  5. Закройте инструмент сравнения

Если у меня не один конфликт, промыть, повторить. Да, это я открываю и закрываю программу просмотра различий один раз для каждого конфликта в слиянии. Поскольку он запускается из командной строки, его закрытие - единственный известный мне способ сообщить git mergetool, что я разрешил этот конкретный конфликт и что он может перейти к следующему.

Конечно, есть способ получше, но я понятия не имею. Помогите, пожалуйста? Этот процесс кажется безумно неэффективным.

Ответов (4)

Решение

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

В git-mergetoolдокументации четко указано:

Если пользовательский инструмент слияния правильно указывает на успешное разрешение слияния с помощью своего кода выхода , тогда для переменной конфигурации mergetool.<tool>.trustExitCodeможно установить значение true.
В противном случае git-mergetoolпользователю будет предложено указать успешное разрешение после выхода из настраиваемого инструмента.

Таким образом, необходим код выхода (или проверка пользователя после выхода из инструмента сравнения ), подразумевая, что пользователь сначала закроет внешний инструмент сравнения.

Это кажется отличным стимулом для уменьшения количества конфликтов при каждой попытке слияния / перебазирования;) (независимо от используемого инструмента VCScs)

Примечание.
Две другие настройки инструментов внешнего сравнения git (« Настройка инструментов сравнения и слияния для Git в Windows » и « Настройка SourceGear DiffMerge с Git ») не дают больших надежд, когда дело доходит до закрытия инструмента внешнего сравнения ...

Я очень, очень, очень долго искал этот ответ. Теперь я наконец получил это простое решение (на удивление):

слияние.

Это откроет объединение в режиме управления версиями. Таким образом, вы можете разрешать конфликты на вкладках и отмечать их как разрешенные всякий раз, когда вы нажимаете кнопку «Помечено как разрешенное».

Проблема для mergetool заключается в том, что он намеренно использует интерфейс командной строки для инициирования сеанса слияния, а затем ожидает возврата вызванной команды, чтобы определить, когда слияние, управляемое пользователем, завершилось.

Большинство инструментов слияния не предоставляют механизм командной строки для запуска сеанса слияния в уже запущенном процессе со способом определения, когда разрешение было завершено и было ли оно успешным или нет.

Вполне возможно, что некоторые инструменты слияния могли бы обеспечить эту функциональность с помощью отдельной команды-оболочки и какого-то типа IPC, но это было бы чрезвычайно специфичным для инструмента и сложным для реализации в общей программе слияния.

Если выбранный вами mergetool поддерживает открытие файлов в существующем экземпляре, вы можете указать команду в конфигурации git:

% 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"'

Это работает достаточно хорошо, я могу начать использовать его сам!