GIT commit – enmienda en el estado HEAD separado

Entiendo que la forma correcta de enmendar un antiguo compromiso de GIT es usar rebase --interactive , pero para aclarar los conceptos, me gustaría entender qué sucede cuando lo hago

  • git checkout <commit>
  • cambiar algo en un file
  • agregue el file cambiado al índice
  • y luego git commit . --amend git commit . --amend

Cuando hago esto, en lugar de modificar el compromiso, ramifica un nuevo compromiso del PADRE de ese mismo compromiso.

¿Es esto solo la forma en que GIT me dice que no puedo enmendar un compromiso que ya tiene commits de niños?

En Git, una vez que se crea un compromiso, está escrito en piedra; no puedes cambiarlo Todo lo que puede hacer es crear una nueva confirmación que se "asemeje" (modificándola, seleccionándola, etc.)

Entiendo tu confusión: "modificar" es un nombre inapropiado y es algo engañoso, ya que sugiere modificar algo en su lugar. En Git, la modificación de un compromiso en realidad implica la creación de un nuevo compromiso que tiene el mismo padre (s) que el compromiso original.

Como ejemplo, supongamos que, después de ejecutar git checkout B , estás en la siguiente situación:

enter image description here

(Tu HEAD está desapegada, pero eso no viene al caso.) Ya sea que git commit --amend y git commit --amend cambios, ejecuta git commit --amend te pondrá en esta situación:

enter image description here

Commit D puede ser muy, muy similar a B ; en particular, puede tener exactamente el mismo parche, exactamente el mismo post de confirmación que B , etc. Sin embargo, las indicaciones de date y hora (commit, author) generalmente serán diferentes (a less que pueda modificar una confirmación en un segundo ), lo que significa que SHA -1 de D diferirá de la de B ; y si dos commits no tienen el mismo SHA, no son el mismo commit.

Cuando decimos que B es una confirmación principal de C , nos referimos a que C confirma la confirmación B por su SHA . Sin embargo, el compromiso C no tiene forma de saber nada sobre el SHA del compromiso D , porque el compromiso D se creó después de C Por lo tanto, D no puede ser el padre de C Es por eso que el compromiso D se activa en una tangente y no tiene ningún descendiente.


Si quieres aterrizar en el siguiente estado,

enter image description here

donde B' es solo ligeramente diferente de B , debes usar git rebase -i , no git commit --amend .