¿Cuáles son las diferencias entre el doble punto "..." y el triple punto "..." en los rangos de confirmación de Git?

Respuestas:

251

Depende de si está utilizando un logcomando o un diffcomando. En el logcaso, está en la man git-rev-parsedocumentación:

Para excluir confirmaciones accesibles desde una confirmación, se utiliza una notación de prefijo ^. Por ejemplo, ^ r1 r2 significa confirmaciones alcanzables desde r2 pero excluye las accesibles desde r1.

Esta operación de configuración aparece con tanta frecuencia que hay una abreviatura para ello. Cuando tiene dos commits r1 y r2 (nombrados de acuerdo con la sintaxis explicada en ESPECIFICAR REVISIONES arriba), puede solicitar commits a los que se pueda acceder desde r2, excepto aquellos a los que se pueda acceder desde r1 mediante "^ r1 r2" y se puede escribir como "r1..r2".

Una notación similar "r1 ... r2" se llama diferencia simétrica de r1 y r2 y se define como "r1 r2 --no $ (git merge-base --todo r1 r2)". Es el conjunto de confirmaciones a las que se puede acceder desde cualquiera de r1 o r2 pero no desde ambas.

Lo que básicamente significa que obtendrá todas las confirmaciones que están en cualquiera de las dos ramas, pero no en ambas.

En el diffcaso, está en la man git-diffdocumentación:

  git diff [--options] <commit>...<commit> [--] [<path>...]

      This form is to view the changes on the branch containing and up to
      the second <commit>, starting at a common ancestor of both
      <commit>. "git diff A...B" is equivalent to "git diff
      $(git-merge-base A B) B". You can omit any one of <commit>, which
      has the same effect as using HEAD instead.

Lo cual es un poco confuso. Básicamente significa que muestra solo las diferencias en esa rama en comparación con otra rama: busca el último compromiso común con el primer compromiso que le diste, y luego difunde el segundo compromiso para eso. Es una manera fácil de ver qué cambios se realizan en esa rama, en comparación con esta rama, sin tener en cuenta los cambios solo en esta rama.

El ..es algo más simple: en el git-diffcaso, es lo mismo que a git diff A By solo difiere A contra B. En el logcaso, muestra todas las confirmaciones que están en B pero no en A.

Pieter
fuente
31
Es bastante ridículo cómo el significado de ..y ...se intercambia exactamente por log y diff: los log A..Bcambios de la base de fusión a B, que es lo que diff A...Bhace
phiresky
1
@phiresky Sí, esa es una usabilidad realmente pobre. Recomiendo no utilizar las anotaciones de punto para git diff.
wisbucky
2
¿Esto significa A...B== A..B + B..A?
Danon
2
@Danon por git logesto es absolutamente sí
maoizm
659

Uso de los rangos de confirmación con Git Log

Cuando usa los rangos de confirmación como ..y ...con git log, la diferencia entre ellos es que, para las ramas A y B,

git log A..B

le mostrará todas las confirmaciones que B tiene que A no tiene , mientras que

git log A...B

le mostrará tanto las confirmaciones que a tiene y que B no tiene, y las confirmaciones de que B ha de que A no tiene, o en otras palabras, se filtrará todas las confirmaciones de que ambos A y B comparten, mostrando solo los commits que ambos no comparten .

Visualización con diagramas de Venn y árboles de compromiso

Aquí hay una representación visual de git log A..B. Las confirmaciones que contiene la rama B que no existen en A es lo que devuelve el rango de confirmación, y se resalta en rojo en el diagrama de Venn y se encierra en un círculo en azul en el árbol de confirmación:

 Diagrama "git log A..B"Árbol 1

Estos son los diagramas para git log A...B. Observe que los comandos que comparten ambas ramas no son devueltos por el comando:

 Diagrama "git log A ... B"Árbol 2

Hacer que el rango de confirmación de triple punto sea ...más útil

Puede hacer que el rango de confirmación de triple punto sea ...más útil en un comando de registro utilizando la --left-rightopción para mostrar qué confirmaciones pertenecen a qué rama:

$ git log --oneline --decorate --left-right --graph master...origin/master
< 1794bee (HEAD, master) Derp some more
> 6e6ce69 (origin/master, origin/HEAD) Add hello.txt

En el resultado anterior, verá que las confirmaciones a las que pertenecen mastertienen el prefijo <, mientras que las confirmaciones a las que pertenecen origin/mastertienen el prefijo >.

Uso de los rangos de confirmación con Git Diff

Algún día podría agregar mi propia explicación sobre cómo funcionan los rangos de confirmación git diff, pero por ahora, es posible que desee consultar ¿Cuáles son las diferencias entre doble punto "..." y triple punto "..." en Git diff commit rangos? .

Ver también

Comunidad
fuente
35
Esta respuesta en realidad explica la diferencia con un texto conciso, ejemplos e imágenes. Me gusta mucho más que la respuesta más votada actualmente que solo cita la documentación poco clara. (TL; Dr. Gracias a esta respuesta, realmente entiendo la diferencia.)
Aerique
44
@Cupcake, ¿podrías agregar el significado ... en git diff?
Marius
1
@Marius en realidad, ahora que lo mencionas, seguiré adelante y vincularé a esa otra pregunta en mi respuesta, para futuros lectores como tú.
2
¿No es esto realmente lo contrario? dig diff a..b es ALL diffs, o básicamente lo mismo que git diff a b. Mientras que git dif a ... b es SOLO los cambios que b ha realizado desde que se ramificó desde a.
wejrowski
2
Al menos para git log. Para git diff, tal vez las cosas se inviertan: stackoverflow.com/questions/7251477/…
Benjamin Atkin