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

Resuelto Pat Notz asked hace 15 años • 5 respuestas

Algunos comandos de Git toman rangos de confirmación y una sintaxis válida es separar dos nombres de confirmación con dos puntos .., y otra sintaxis usa tres puntos ....

¿Cuáles son las diferencias entre los dos?

Pat Notz avatar Jan 21 '09 03:01 Pat Notz
Aceptado

Usando rangos de confirmación con Git Log

Cuando usas rangos de confirmación como ..y ...with 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 y que A no tiene , mientras que

git log A...B

le mostrará tanto las confirmaciones que A tiene como las que B no tiene, y las confirmaciones que B tiene y que A no tiene, o en otras palabras, filtrará todas las confirmaciones que A y B comparten, por lo tanto, solo se muestran las confirmaciones que no comparten ambos .

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 son las que devuelve el rango de confirmación, y están resaltadas en rojo en el diagrama de Venn y encerradas en un círculo azul en el árbol de confirmación:

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

Estos son los diagramas de git log A...B. Observe que el comando no devuelve las confirmaciones compartidas por ambas ramas:

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

Hacer que el rango de compromiso de triple punto ...sea más útil

Puedes hacer que el rango de confirmación de tres puntos ...sea más útil en un comando de registro usando 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 que pertenecen a mastertienen el prefijo <, mientras que las confirmaciones que pertenecen a origin/mastertienen el prefijo >.

Usando 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 desees consultar ¿Cuáles son las diferencias entre ".." de doble punto y "..." de triple punto en Git diff commit? rangos? .

Ver también

  • Pro Git § 6.1 Herramientas Git - Selección de revisión - Rangos de confirmación
 avatar Jun 12 '2014 14:06

Depende de si estás usando 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 accesibles desde r2 pero excluye aquellas a las que se puede acceder desde r1.

Esta operación de configuración aparece con tanta frecuencia que existe una abreviatura para ella. Cuando tiene dos confirmaciones r1 y r2 (nombradas de acuerdo con la sintaxis explicada en ESPECIFICAR REVISIONES arriba), puede solicitar confirmaciones a las que se puede acceder desde r2, excluyendo aquellas a las que se puede 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 --not $(git merge-base --all r1 r2)". Es el conjunto de confirmaciones a las que se puede acceder desde r1 o r2, pero no desde ambos.

Lo que básicamente significa que obtendrás 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 diferencia el segundo compromiso con ese. 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 en esta rama únicamente.

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

Pieter avatar Jan 20 '2009 20:01 Pieter