2011-08-31 11 views
121

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

git diff foo master # a 
git diff foo..master # b 
git diff foo...master # c 

The diff manual habla de ello:

ramas Comparando

$ git diff topic master <1> 
$ git diff topic..master <2> 
$ git diff topic...master <3> 
  1. cambios entre las puntas del tema y de la ramas principales
  2. Igual que el anterior.
  3. Cambios que ocurrieron en la rama maestra desde que se inició la rama de tema.

pero no estoy del todo claro para mí.

+0

Si bien la cuestión no es un duplicado, [esta respuesta] (http://stackoverflow.com/questions/5256249/git-diff-doesnt-show -enough/5257065 # 5257065) muestra gráficamente el significado de '..' y' ... 'en' git diff' y sus diferentes significados en 'git log'. –

+2

posible duplicado de [¿Cuáles son las diferencias entre punto doble ".." y punto triple "..." en rangos de compromiso Git?] (Http://stackoverflow.com/questions/462974/what-are-the -differences-between-double-dot-and-triple-dot-in-git-com) – chharvey

Respuesta

206

Puesto que ya había creado estas imágenes, pensé que podría valer la pena usarlos en otra respuesta, aunque la descripción de la diferencia entre .. (punto-punto) y ... (punto-punto-punto) es esencialmente el mismo que en manojlds's answer.

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. Los .. y ... anotaciones en git diff tienen los siguientes significados:

An illustration of the different ways of specifying commits for git diff

En otras palabras, git diff foo..bar es exactamente el mismo que git diff foo bar; ambos le mostrarán la diferencia entre las puntas de las dos ramas foo y bar. Por otro lado, git diff foo...bar le mostrará la diferencia entre la "base de fusión" de las dos ramas y la punta de bar. La "base de combinación" suele ser el último compromiso en común entre esas dos ramas, por lo que este comando le mostrará los cambios que su trabajo en bar ha introducido, mientras ignora todo lo que se ha hecho en foo mientras tanto.

Eso es todo lo que necesita saber sobre las anotaciones .. y ... en git diff. Sin embargo ...


... una fuente común de confusión aquí es que .. y ... decir cosas sutilmente diferentes cuando se utiliza en un comando como git log que espera un conjunto de confirmaciones como uno o más argumentos. (. Estos comandos todos terminan usando git rev-list para analizar una lista de confirmaciones de sus argumentos)

El significado de .. y ... para git log se puede mostrar gráficamente como a continuación:

An illustration of the different ways of specifying ranges of commits for git log

Así, git rev-list foo..bar le muestra todo en la rama bar que no está también en la rama foo. Por otro lado, git rev-list foo...bar muestra todas las confirmaciones que están en fooobar, pero no en ambas. El tercer diagrama solo muestra que si lista las dos ramas, obtendrá las confirmaciones que están en uno o en ambos.

Bueno, me parece que todo es un poco confuso, de todos modos, y creo que el cometer diagramas de gráficos ayuda :)

¹ Sólo digo "normalmente", ya la hora de resolver los conflictos de fusión, por ejemplo, git diff le mostrará una combinación de tres vías.

+1

Me gustan tus diagramas. [Yo también creé el mío hace un tiempo] (http://stackoverflow.com/a/24186641/456814). Tengo algunas ideas para mis propios diagramas 'git diff' que haré más tarde. –

+13

¿Alguien lo notó? Los efectos de '..' y' ... 'feel _reversed_ en' git diff' (en comparación con 'git rev-list')! –

+1

Me tienes en "Eso es todo lo que necesitas saber [...]. Sin embargo ...". :-) Git está lleno de cosas como esta, donde la notación y la terminología similares significan cosas diferentes en diferentes contextos; gracias por aclarar esto tan bien. – ShreevatsaR

6
git diff foo master 

mostrará las diferencias entre el tema y la rama principal en ese punto en el tiempo

git diff foo..master 

esto también va a mostrar las diferencias entre el tema y la rama principal en ese punto en el tiempo

git diff foo...master 

esto mostrará todas las diferencias entre cuando el tema se hizo de la rama y después

por lo que los primeros 2 comandos son los mismos y el último solo muestra una vista más amplia en la historia de los diff

20

git diff foo master Diferencia entre los commits 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 maestro a la punta del maestro. En otras palabras, muestra solo los cambios que la rama maestra ha introducido desde su ancestro común con maestro.

This example de GitHub explica cuándo utilizar los dos:

Por ejemplo, si crea una rama 'dev' y agregar una función a un archivo , y luego volver a su rama 'master' y quitar una línea desde el README, y luego ejecutar algo como esto:

$ git diff master dev 

se le dirá que una función se añadió desde el primer archivo y se añadió una línea a la README. ¿Por qué? Debido a que en la rama, el archivo README todavía tiene la línea original, pero en 'master' lo eliminó, por lo que comparando directamente las instantáneas parece que 'dev' lo agregó.

Lo que realmente quiere comparar es qué 'dev' ha cambiado desde que sus ramas divergieron.Para hacer eso, Git tiene un pequeño abreviada:

$ git diff master...dev 
+2

git diff foo ... master cambios que la rama principal ha introducido ya que es antecesor común con foo – 0fnt

+0

@manojlds bien, pregunta diferente , si usted está en la rama dev y confirma sus cambios (la función) y envía los cambios a una rama remota de desarrollo, ¿significa esto que el cambio visible es solo la función o la función y el archivo Léame? – David

+0

@ 0fnt eso es correcto. Lo arreglé –

11

Mi versión consolidada de .. vs ... con diff vs registro

Diff vs Log & .. vs ..

+0

esto sería muy bueno, si tan solo no tuviera tantos colores diferentes y las operaciones de conjunto se mezclaran con '..' /' ... 'cosas. Por ejemplo, en 'log A ... B' no está claro si el comando devuelve la intersección (parte blanca del diagrama) o el resto de la unión A-B (verde). Sería más directo sin ningún operando establecido y con solo 1 color. – xealits

Cuestiones relacionadas