Al deshacer un git rebase con un reflog, ¿importa qué compromiso elijas?

Sé cuál fue la confirmación (b7104e0) para mi twig de características (GL18) antes de intentar una rebase, que fue mal. Estoy mirando a través de Git Reflog en Eclipse y enumera el commit b7104e0 varias veces. Quiero restablecer el cabezal de GL18 nuevamente a b7104e0. ¿Importa qué b7104e0 confirme elijo en reflog en el que reiniciar, o todo es igual?

Un hash git se calcula utilizando el post de confirmación, el autor de confirmación, la date de confirmación, el hash de tree y todos los hashes de confirmación principal. Consulte esta publicación en el blog sobre la anatomía de un commit de Git para get más información.

Esto significa que cada confirmación que veas con el mismo hash es exactamente la misma confirmación. Puedes usar cualquiera de estos. De hecho, si reinicia, restablece el hash de confirmación: git reset --hard b7104e0 .

No, pero solo por claridad, ya que el text del titular y del cuerpo parece al principio hacer preguntas diferentes, vamos a deletrearlo explícitamente aquí:

  • El "verdadero nombre" de cualquier confirmación (o de hecho cualquier object de repository en git) es su SHA-1, que en este caso comienza con b7104e0 (pero continúa para otros 33 caracteres). Este nombre verdadero identifica de manera única el object. Se puede abreviar a algo más corto, como en este caso, siempre que la versión más corta permanezca única.

  • Todos los demás nombres, como nombres de twigs, tags, la reference especial HEAD , los ligeramente especiales (pero aún especiales) ORIG_HEAD , MERGE_HEAD , CHERRY_PICK_HEAD , y así sucesivamente, y ( finalmente :-)) reflog inputs como HEAD@{3} o branchname @{1} , son solo forms de express el "verdadero nombre" SHA-1 ID. Hay una exención especial para esta regla cuando se utiliza la git checkout o un command que reescribe un nombre de reference, pero en general, un nombre o una input de reflog solo se resuelve en la ID. Muchos nombres pueden resolverse en una sola ID, o tal vez solo un nombre se resuelve en la ID, pero los nombres se resuelven en ID, en general. 1

Una vez que tenga la identificación correcta, no importa cómo la obtuvo.


1 Solo para completar: es obvio que si vamos a cambiar el ID objective de SHA-1 de un nombre, por ejemplo, para mover una twig o escribir un nuevo valor en CHERRY_PICK_HEAD , necesitamos el nombre, no su ID actual. El otro lugar donde necesitamos un nombre es cuando utilizamos una reference indirecta ("simbólica"), como cuando HEAD nombra ref: refs/heads/master para que esté on branch master como lo indicará el git status .

También tenemos un caso especial en el que un nombre no se resuelve en ninguna ID de SHA-1, y esa es la twig de "twig por nacer", que es más común en un nuevo repository sin compromisos: en este caso, usted está en el master sucursal, pero los refs/heads/master no pueden resolver un ID de confirmación ya que todavía no hay confirmaciones. Este caso especial puede repetirse más tarde si usa la git checkout --orphan para crear una nueva twig que no apunta (todavía) a ningún SHA-1 (adquirirá su SHA-1 inicial en el siguiente compromiso). En estos dos casos raros, la reference HEAD existe pero nombra una twig que literalmente no existe (todavía).