example - ¿Algoritmo git diff que no rasga funciones?(Difícil del lenguaje)
git pull (2)
¿Es posible configurar git diff para respetar la sangría y la sintaxis? No estoy hablando de ignorar la sangría y los espacios, sino más bien utilizar líneas en blanco, niveles de sangría y posiblemente corchetes, para ayudar a hacer coincidir las líneas antiguas con las nuevas.
Por ejemplo, git diff a menudo corta funciones y su bloque de documentos, como este:
class C {
/**
+ * Goes to the bar.
+ */
+ function bar() {
+ return ''bar'';
+ }
+
+ /**
* Gets your foo up to date.
*/
function foo() {
Cuando preferiria
class C {
+
+ /**
+ * Goes to the bar.
+ */
+ function bar() {
+ return ''bar'';
+ }
/**
* Gets your foo up to date.
*/
function foo() {
En este ejemplo, sigue siendo bastante inofensivo, pero hay ejemplos en los que las funciones y su docblock están realmente destrozados debido a la implementación codiciosa y vívida de la diferencia.
Nota: Ya configuré *.php diff=php
en ~/.gitattributes
.
EDITAR: Otro ejemplo: aquí git diff mezcla una propiedad docblock con un método docblock:
/**
- * @var int
+ * @param string $str
*/
En primer lugar, use un algoritmo de diferencias más sofisticado como:
git config --global diff.algorithm histogram
Luego también hay herramientas de diferencia semántica como https://github.com/GumTreeDiff/gumtree cuyo algoritmo también se ha implementado en clang-diff: https://github.com/krobelus/clang-diff-playground
No sé cómo hacerlo solo en git, pero hay al menos una herramienta comercial (es decir, cuesta dinero) que se ocupa de ese tipo de problemas, llamada SemanticMerge .
Puede manejar muchos casos interesantes, y es compatible con C #, Java y parcialmente C. Puedes configurar git para usarlo como herramienta de combinación.
(No estoy afiliado).