El ajuste del algorithm de diferencia pnetworkingeterminado no se traduce en el algorithm de fusión pnetworkingeterminado (paciencia)

He visto muchas publicaciones de blog y las publicaciones de desbordamiento de stack dicen que git config --global diff.algorithm patience permitirá que tanto diffs como git config --global diff.algorithm patience utilicen la opción de estrategia de paciencia con el algorithm recursivo pnetworkingeterminado.

He encontrado que este no es el caso, y planteo la siguiente demostración para mostrar por qué no.

 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 

imagen Esta image (cortesía de la image de Meld se ve bastante bien. Tratemos de fusionarla).

 git merge origin/patience-merge-2 

imagen

¿Huh? Esa fusión se ve fea. A pesar de que las líneas 9-19 no cambian en realidad, se marcan como conflictivas / cambiadas de una manera completamente diferente que con la diferencia.

Si forzamos la combinación para usar la opción de estrategia de paciencia:

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

imagen

Eso está mucho mejor. Los conflictos coinciden con la diferencia que hicimos anteriormente y son semánticamente correctos.

¿Cómo puedo hacer que la fusión realmente use la configuration de paciencia, no solo los diffs?

Disparos adicionales en la oscuridad Lo intenté (sin éxito):

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

Información del sistema:
Windows 8.1
git versión 1.8.4.msysgit.0 (a través de GitHub para Windows 2.0)

Parchear git, como Appleman1234 no es ideal. Espero que esta característica venga en futuras versiones.

Por ahora, creo que tendré que conformarme con el alias

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

lo que me permite hacer

 git pmerge origin/patience-merge-2 

en lugar de

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

en el ejemplo que di antes.

Una forma sería parchear git para agregar la funcionalidad que está solicitando.

Un ejemplo de parche sin comprimir, no comstackdo para builtin / merge.c es

 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); > } 

Tenga en count que, creo que si un parche como este fuera para ser incluido en git, probablemente tendría que haber un trabajo adicional para agregar un valor de configuration que habilite y deshabilite este comportamiento, ya que la documentation establece claramente que cambiar ese valor solo cambia la diferencia. algorithm. Una alternativa a esto es agregar una variable de configuration merge.algorithm y hacer que haga la lógica pnetworkingeterminada si se desarma y el algorithm en merge.algorithm si se establece.

Otra alternativa que no requiere cambios de código es el shell aliasing de los commands de git.