¿Cuáles son las diferencias entre "..." de doble punto y "..." de triple punto en los rangos de confirmación de Git?
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?
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:
Estos son los diagramas de git log A...B
. Observe que el comando no devuelve las confirmaciones compartidas por ambas ramas:
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-right
opció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 master
tienen el prefijo <
, mientras que las confirmaciones que pertenecen a origin/master
tienen 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
Depende de si estás usando un log
comando o un diff
comando. En el log
caso, está en la man git-rev-parse
documentació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 diff
caso, está en la man git-diff
documentació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-diff
caso, es lo mismo que a git diff A B
y solo diferencia A de B. En el log
caso, muestra todas las confirmaciones que están en B pero no en A.