2009-02-25 3 views
50

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

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

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

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

+6

Вы также можете запустить 'git mergetool -y', чтобы пропустить промежутки между ними. Вам все равно придется закрыть mergetool, но вам не придется возвращаться к терминалу и нажимать return для каждого нового слияния. – moeffju

+1

Если вы делаете git-слияние кучи файлов, и это все, о чем вам нужно беспокоиться, вам не о чем беспокоиться. – jwg

+0

@moeffju это лучший ответ для ускорения процесса слияния конфликтов. – mqklin

ответ

34

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

git-mergetool documentation ясно сказано:

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

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

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

Примечание:
Два других мерзавец внешних дифференциалов инструменты настройки («Setting up diff and merge tools for Git on Windows» и «Setting up SourceGear DiffMerge with Git») не дает больше надежды, когда он пришел к не закрывая внешний инструмент сравнения ...

+1

Правда. :-) Спасибо за проверку работоспособности. Что вы и другие люди используете для слияния? Просто открытие файлов в вашем редакторе по выбору? –

+0

Я использую WinMerge для Windows, но мне нужно закрыть его после каждого разрешения, как и вы. – VonC

12

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

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

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

+1

Согласен с этим анализом. +1 – VonC

+0

Git может определить «статус успеха слияния» в зависимости от того, была ли обновлена ​​(изменена) цель слияния. Тогда, если я «сохраню слияние», это означает, что я успешно завершил. В противном случае это не так. Но, возможно, для этого варианта использования требуется двухэтапное слияние. – phord

+0

@phord: он делает это для инструментов, которые не сообщают о состоянии через их возвращаемые значения, но это не помогает в этом случае, так как по-прежнему не будет никаких указаний, когда git проверяет статус как сеанс инструментов был уже запущен и может продолжаться после завершения слияния. –

22

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

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

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

+0

Интересно. Я попробую это с WinMerge. +1 – VonC

+0

Должен признаться, это довольно здорово. Обязательно обязательно посмотреть, что я могу взломать для Мелда. –

+0

Похоже, что есть ожидающий патч и биг-билет, чтобы meld мог использоваться таким образом: http://bugzilla.gnome.org/show_bug.cgi?id=453670 –

Смежные вопросы