¿Cuáles son las diferencias entre "..." de doble punto y "..." de triple punto en los rangos de confirmación de diferencias de Git?
¿Cuáles son las diferencias entre los siguientes comandos?:
git diff foo master # a
git diff foo..master # b
git diff foo...master # c
El manual de diferencias habla de ello:
Comparando sucursales
$ git diff topic master <1> $ git diff topic..master <2> $ git diff topic...master <3>
- Cambios entre los consejos del tema y las ramas maestras.
- Lo mismo que arriba.
- Cambios que ocurrieron en la rama maestra desde que se inició la rama temática.
pero no me queda del todo claro.
Como ya había creado estas imágenes, pensé que valdría la pena usarlas en otra respuesta, aunque la descripción de la diferencia entre ..
(punto-punto) y ...
(punto-punto-punto) es esencialmente la misma que en la respuesta de manojlds .
El comando git diff
normalmente¹ solo muestra la diferencia entre los estados del árbol entre exactamente dos puntos en el gráfico de confirmación. Las notaciones ..
y en tienen los siguientes significados:...
git diff
# Left side in the illustration below:
git diff foo..bar
git diff foo bar # same thing as above
# Right side in the illustration below:
git diff foo...bar
git diff $(git merge-base foo bar) bar # same thing as above
En otras palabras, git diff foo..bar
es exactamente igual que git diff foo bar
; ambos te mostrarán la diferencia entre las puntas de las dos ramas foo
y bar
. Por otro lado, git diff foo...bar
te mostrará la diferencia entre la "base de unión" de las dos ramas y la punta de bar
. La "base de fusión" suele ser la última confirmación en común entre esas dos ramas, por lo que este comando le mostrará los cambios que ha bar
introducido su trabajo, ignorando todo lo que se ha hecho foo
mientras tanto.
Eso es todo lo que necesitas saber sobre las notaciones ..
y ...
en git diff
. Sin embargo...
... una fuente común de confusión aquí es que ..
significa ...
cosas sutilmente diferentes cuando se usa en un comando como git log
el que espera un conjunto de confirmaciones como uno o más argumentos. (Todos estos comandos terminan utilizándose git rev-list
para analizar una lista de confirmaciones a partir de sus argumentos).
El significado de ..
y ...
para git log
se puede mostrar gráficamente a continuación:
Entonces, git rev-list foo..bar
le muestra todo lo que hay en la rama bar
que no está también en la rama foo
. Por otro lado, git rev-list foo...bar
te muestra todas las confirmaciones que están en cualquiera de los dos foo
o bar
, pero no en ambos . El tercer diagrama simplemente muestra que si enumera las dos ramas, obtendrá las confirmaciones que están en una o en ambas.
Bueno, de todas formas todo esto me parece un poco confuso y creo que los diagramas de gráficos de confirmación ayudan :)
¹ Sólo digo "típicamente" ya que al resolver conflictos de fusión, por ejemplo, git diff
te mostrará una fusión de tres vías.
Mi versión consolidada del ..
vs ...
con diff vs log