Подтвердить что ты не робот

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

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

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

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

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

Как я могу сделать слияние на самом деле использовать настройку терпения, а не просто diff?

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

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)

4b9b3361

Ответ 1

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

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

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

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

git pmerge origin/patience-merge-2

вместо

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

в приведенном выше примере.

Ответ 2

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

Пример untested, uncompiled патч builtin/merge.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, вероятно, потребуется дополнительная работа, чтобы добавить значение конфигурации, которое включает и отключает это поведение как documentation четко заявляет, что изменение этого значения только изменяет алгоритм дифференциала. Альтернативой этому является добавление параметра конфигурации merge.algorithm и если он выполняет логику по умолчанию, если не задан, и алгоритм в файле merge.algorithm если установлен.

Другой альтернативой, которая не требует изменения кода, является сглаживание команд git.