Diferencia entre los commands de reinicio de git

He estado usando git reset --soft HEAD^ y git reset --soft HEAD~1 cuando quiero devolver mi última confirmación al área de preparación. Los he usado indistintamente, pero me preguntaba si había diferencias sutiles. Si no hay ninguno, ¿puedes explicar la diferencia sintáctica? ¿Es ^ solo un alias de ~1 ?

HEAD^ y HEAD~1 refieren a la misma confirmación.

^ refiere al primer padre de la confirmación. ~n refiere al antecesor n: th. Entonces ^^ (padre-de-padre) es equivalente a ~2 .

La sutileza principal que se me ocurre es si hay varios padres en la confirmación actual (es decir, se trata de una confirmación de fusión). En ese caso, HEAD^ y HEAD^2 son válidos y se refieren a diferentes commits. HEAD~1 refiere a HEAD^ pero no a HEAD^2

La página man de gitrevisions tiene muchos detalles y ejemplos.

A pesar de que HEAD^ y HEAD~1 hacen lo mismo, se refieren a cosas ligeramente diferentes. HEAD^ es la abreviatura de HEAD^1 , que hace reference al primer padre de commit y HEAD^2 se referiría al segundo padre del commit. HEAD~ es una abreviatura de HEAD~1 , que hace reference al primer padre del commit y HEAD~2 reference al primer padre del primer padre del commit. Estas dos syntax son intercambiables a less que HEAD sea ​​una confirmación de fusión, en cuyo caso puede tener más de un padre (la confirmación anterior en la twig maestra y la confirmación anterior en la twig fusionada en maestra).

La diferencia es que HEAD~1 se usa para una historia lineal, mientras que HEAD^ puede seguir commits con múltiples padres.

HEAD ^ y HEAD ~ 1 son lo mismo.

De mis notas:

ref ^ significa la confirmación antes de ref . Múltiples ^ caracteres pueden ser utilizados. Ejemplo: HEAD ^^^

ref ~ n significa el enésimo commit antes de ref . Ejemplo: HEAD ~ 3

Hay formularios más complicados que le permiten tratar el caso en el que su reference base (por ejemplo, HEAD) es el resultado de una fusión.

En realidad, puede ser realmente complicado. Ver https://www.kernel.org/pub/software/scm/git/docs/gitrevisions.html

No, HEAD^ y HEAD~1 (así como HEAD~ o HEAD^1 ) se refieren a la misma confirmación.

Agregar un ^ o ~ después de algo que describe a una confirmación cambiará la reference al primer padre de la confirmación descrita por la parte anterior del argumento.

La diferencia aparece cuando un número sigue al símbolo. Si no se proporciona ningún número, funciona igual que si se usó 1 .

Un número que sigue a ^ selecciona cuál de los padres de una combinación se debe utilizar (algo así como elegir el padre o la madre). El primer padre sería el compromiso que se desprotegió cuando se creó la fusión de compromiso, los otros padres serían commits nombrados con el command git merge .

Un número que sigue a ~ refiere al número de generaciones que se remontan (después de la primera relación principal en cada paso), 1 al padre inmediato, 2 al abuelo y demás.

Estas notaciones también se pueden encadenar como HEAD~3^2~5 , aunque normalmente sería más sencillo usar una identificación SHA1 para referirse a confirmaciones que necesitarían ese tipo de notación.

Si ya se ha comprometido con su repository local (es decir, git commit -m), puede revertir ese último commit haciendo git reset –soft HEAD ~ 1 Si ya ha organizado sus cambios (es decir, con git add), entonces puede revertir la puesta en escena haciendo reset de git – HEAD mezclado y git reset –hard borra todo (incluso los cambios locales). El ~ after head te dice a cuántos commits ir desde arriba.