¿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:
Comparar ramas
$ 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 del tema.
Pero no está totalmente claro para mí.
..
y...
engit diff
y sus diferentes significados engit log
.Respuestas:
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
típicamente¹ solo muestra la diferencia entre los estados del árbol entre exactamente dos puntos en el gráfico de confirmación. Las anotaciones..
y...
engit diff
tienen los siguientes significados:En otras palabras,
git diff foo..bar
es exactamente lo mismo quegit diff foo bar
; ambos le mostrarán la diferencia entre las puntas de las dos ramasfoo
ybar
. Por otro lado,git diff foo...bar
le mostrará la diferencia entre la "base de fusión" de las dos ramas y la punta debar
. 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 quebar
ha introducido su trabajo , mientras ignora todo lo que se ha hecho mientrasfoo
tanto.Eso es todo lo que necesita saber sobre las anotaciones
..
y . Sin embargo......
git diff
... una fuente común de confusión aquí es eso
..
y...
significa cosas sutilmente diferentes cuando se usa en un comando como elgit log
que espera un conjunto de confirmaciones como uno o más argumentos. (Todos estos comandos terminan usandogit rev-list
para analizar una lista de confirmaciones de sus argumentos).El significado de
..
y...
paragit log
se puede mostrar gráficamente de la siguiente manera:Entonces,
git rev-list foo..bar
te muestra todo en la ramabar
que no está también en la ramafoo
. Por otro lado,git rev-list foo...bar
muestra todos los commits que están en unofoo
obar
, pero no en ambos . El tercer diagrama solo muestra que si enumera las dos ramas, obtiene las confirmaciones que están en una o en ambas.Bueno, creo que todo es un poco confuso, de todos modos, y creo que los diagramas de gráficos de confirmación ayudan :)
¹ Solo digo "típicamente" ya que al resolver conflictos de fusión, por ejemplo,
git diff
le mostrará una fusión de tres vías.fuente
git diff
diagramas que haré más adelante...
y la...
sensación se invierten engit diff
( en comparación congit rev-list
)!git diff foo..bar
es exactamente lo mismo quegit diff foo bar
; ambos le mostrarán la diferencia entre las puntas de las dos ramas foo y bar". ¿Qué quiere decir exactamente con la "diferencia entre las puntas de las dos ramas"?Mi versión consolidada de .. vs ... con diff vs log
fuente
..
/...
stuff. Por ejemplo, enlog A...B
no está claro si el comando devuelve la intersección (parte blanca del diagrama) o el resto de la unión AB (verde). Sería más adecuado sin operandos establecidos y con solo 1 color.diff A..B
<—>log A...B
, es decir, realmente difiere con 2 puntos, corresponde al registro con 3 (!) Puntos? ¿O hay un error tipográfico en la imagen? Al observar cómo los puntos están codificados por colores, me parece que hay un error tipográfico en la imagen. La esquina inferior izquierda:log A...B
debe serlog A..B
, derecha (?). Y registro justo a la derecha debe ser...
no..
.git diff foo master
Diferencia entre los compromisos superiores (cabeza) de foo y master.git diff foo..master
Otra forma de hacer lo mismo.git diff foo...master
Difiere del ancestro común (git merge-base foo master
) de foo y master a tip of master. En otras palabras, muestra solo los cambios que la rama maestra ha introducido desde su ancestro común con foo.Este ejemplo de GitHub explica cuándo usar los dos:
fuente
mostrará las diferencias entre el tema y la rama maestra en ese momento
esto también mostrará las diferencias entre el tema y la rama maestra en ese momento
Esto mostrará todas las diferencias entre cuándo se hizo el tema desde la rama y después
así que los primeros 2 comandos son los mismos y el último solo muestra una vista más amplia en el historial de diferencias
fuente
La imagen superior es equivalente al árbol gráfico inferior.
Una imagen vale más que mil palabras, la diferencia entre
..
...
^
se muestra a continuación.fuente