2009-11-10 16 views
11

Bien, así que hice algunos cambios en mi proyecto que resultaron en un gran desastre. Ya había confirmado los cambios para poder volver a hacerlo más tarde y luego utilicé git checkout HEAD^para pagar la confirmación anterior. Ahora que estoy haciendo commits en mi proyecto, muestra SHA-1 en la línea de comando como rama de trabajo (en lugar de maestro)¿Cómo lo corrijo? HEAD^en git

No sé todo lo que hay que saber sobre git pero supongo HEAD sigue señalando mi copia rota ya que estoy saliendo en una tangente y he resuelto el problema. ¿Cómo puedo señalar HEAD al último commit del que estoy trabajando?

Supongo que tiene que ver con rebase, pero no estoy 100% seguro.

Gracias.

Respuesta

23

Ahora como estoy haciendo confirmaciones de mi proyecto que muestra el SHA-1 en la línea de comandos como la rama de trabajo (en lugar de maestro)

Esto probablemente significa que tiene una “cabeza separada”. Un HEAD separado apunta directamente a una confirmación en lugar de señalar a una rama (que luego apunta a una confirmación). Una cabeza separada es como una rama sin nombre.

Este estado fue causado por el comando git checkout HEAD^ ya que HEAD^ hace referencia a una confirmación, no a un nombre de rama. Probablemente quería hacer git reset --hard HEAD^ - mientras principal seguía siendo la rama activa: para dejar caer la más reciente de confirmación desde maestro (que seguiría existiendo en el disco y sea accesible a través de la reflog hasta su entrada en el reflog expirado) .

¿Cómo puedo señalar HEAD al último compromiso del que estoy trabajando?

HEAD es siempre la confirmación de la que está trabajando, ya sea que esté separada o no.

Si se refiere a “¿Cómo he de decirle maestro a la última cometer estoy trabajando desde?”, Entonces eso es lo mismo que preguntar “¿Cómo puedo obtener maestro para que apunte a HEAD?”.La respuesta es

git branch -f master HEAD 

(en realidad, puede dejar fuera HEAD, ya que es el valor por defecto). Esto restablece forzosamente maestro a la confirmación actualmente en HEAD. Ningún commit en maestro que no son accesibles a través de otra rama o la corriente HEAD serán a partir de ahora sólo será accesible a través de la reflog y eventualmente serán basura recogida (esto arroja lejos, de maestro, nada en maestro que no está en HEAD). También es probable que desee volver a conectar su HEAD a este maestro actualizado después de esto.

git checkout master 

En lugar de los dos comandos anteriores, se puede volver a conectar HEAD en primer lugar, a continuación, restablezca maestro con estos dos comandos consecutivos:

git checkout master   # reattach, commit at HEAD is now the unwanted commit 
git reset --hard [email protected]{1} # reset master to the commit at HEAD before the prior command 

La notación [email protected]{1} se utiliza para acceder a las entradas en el reflog. Este ejemplo solo significa "el HEAD anterior" (es decir, "el compromiso en HEAD antes de la operación más reciente que afectó HEAD").

+1

Gracias por entrar en profundidad. –

3
git checkout HEAD 
git reset HEAD^ 

Esto borrará la confirmación más reciente. Confirme que funcionó con svn log.

Noté que etiquetó este git-svn. Esto solo funcionará si aún no has empujado el compromiso comprometido a svn. Si usted tiene, usted tendrá que aplicar una fusión inversa del mal estado comprometerse así:

$ git log 
commit 30480f327040f812cb2afffdd1cdd374bf26fe83 
Author: you 
Date: today 

    messed up commit 

$ git revert 30480f327040f812cb2afffdd1cdd374bf26fe83 

donde 30480f327040f812cb2afffdd1cdd374bf26fe83 es ​​el hash del mal estado comprometerse.

1

creo que lo que estás buscando es git reset:

git checkout HEAD 
git reset --hard HEAD^ 

Esto se llevará a "maestro" de nuevo a una revisión previa a la cabeza actual. Con lo que estás trabajando en este momento se llama "cabeza separada", ya que no tiene un nombre simbólico asociado.

Cuestiones relacionadas