Установка алгоритма сравнения по умолчанию не преобразуется в алгоритм слияния по умолчанию (терпение)

Я видел много сообщений в блогах и сообщений о переполнении стека, в которых говорится, что git config --global diff.algorithm patience позволит как различиям, так и слияниям использовать вариант стратегии терпения с рекурсивным алгоритмом по умолчанию.

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

git config --global diff.algorithm patience   //mythical config statement  

git clone https://github.com/kjlubick/PracticingGit.git
cd PracticingGit
git checkout origin/patience-merge-1 -t

git checkout -b merge_test           //temp branch for merging
git diff origin/patience-merge-2

imageЭтот diff (изображение предоставлено meld выглядит неплохо. Давайте попробуем его объединить.

git merge origin/patience-merge-2

image

Хм? Это слияние выглядит некрасиво. Несмотря на то, что строки 9-19 на самом деле не меняются, они помечаются как конфликтующие/измененные совершенно иначе, чем в diff.

Если мы заставим слияние использовать опцию стратегии терпения:

git merge --abort
git merge origin/patience-merge-2 -X patience

image

Это намного лучше. Конфликты совпадают с различиями, которые мы сделали ранее, и семантически корректны.

Как сделать так, чтобы слияние действительно использовало настройку терпения, а не только различия?

Дополнительные снимки в темноте пробовал (безуспешно):

git config --global merge.algorithm patience
git config --global merge.diff.algorithm patience

Информация о системе:
Windows 8.1
git версии 1.8.4.msysgit.0 (на GitHub для Windows 2.0)


person KevinL    schedule 31.07.2014    source источник
comment
На справочной странице для параметра -s сказано следующее: Use the given merge strategy; can be supplied more than once to specify them in the order they should be tried. If there is no -s option, a built-in list of strategies is used instead (git merge-recursive when merging a single head, git merge-octopus otherwise). Похоже, сделать это поведением по умолчанию вряд ли возможно.   -  person Chris Hayes    schedule 03.08.2014
comment
Так что, возможно, через git config это невозможно, но как насчет обходных путей? Есть ли другой способ?   -  person KevinL    schedule 06.08.2014


Ответы (3)


Исправление git, например Appleman1234, не идеально. Я надеюсь, что эта функция появится в будущих версиях.

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

git config --global alias.pmerge "merge -X patience --"

что позволяет мне делать

git pmerge origin/patience-merge-2

вместо

git merge origin/patience-merge-2 -X patience

в примере, который я привел ранее.

person KevinL    schedule 10.08.2014


Одним из способов было бы исправить git, чтобы добавить функциональность, которую вы запрашиваете.

Пример непроверенного, нескомпилированного патча для встроенного/слияния .c это

diff -Nar merge.c merge.c-new 
77c77
< static const char *pull_twohead, *pull_octopus;
---
> static const char *pull_twohead, *pull_octopus,*diff_algorithm;
586a587,588
>       else if (!strcmp(k, "diff.algorithm"))
>               return git_config_string(&diff_algorithm, k, v);
1305a1308,1311
>               int diff_algorithm_mask = 0;
>               if (diff_algorithm != null){
>                       diff_algorithm_mask = parse_algorithm_value(diff_algorithm);
>               }
1308a1315,1317
>                       if (diff_algorithm != null){
>                               add_strategies(diff_algorithm,diff_algorithm_mask);
>                       }
1310a1320,1322
>                       if (diff_algorithm != null){
>                               add_strategies(diff_algorithm,diff_algorithm_mask);
>                       }

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

Другая альтернатива, не требующая изменения кода, — псевдоним команд git оболочки.

person Appleman1234    schedule 08.08.2014
comment
Изменения кода не идеальны. Думаю, мне придется согласиться на псевдоним git config --global alias.pmerge "merge -X patience --" - person KevinL; 10.08.2014