tag rama que crear como cambiar git git-checkout git-reset git-revert git-reflog

git - rama - ¿Cómo mover HEAD de regreso a una ubicación anterior?(Cabeza separada) y deshacer confirma



git push tag (6)

En git, estaba tratando de hacer una squash commit fusionándome en otra rama y luego restableciendo HEAD al lugar anterior a través de:

git reset origin/master

Pero necesito salir de esto. ¿Cómo puedo mover HEAD de regreso a la ubicación anterior?

Tengo el 23b6772 SHA1 ( 23b6772 ) del commit al que necesito moverlo.
¿Cómo puedo volver a este commit?


Antes de responder agreguemos algunos antecedentes, explicando qué es este HEAD .

First of all what is HEAD?

HEAD es simplemente una referencia a la confirmación actual (más reciente) en la rama actual.
Solo puede haber una sola HEAD en un momento dado. (excluyendo git worktree )

El contenido de HEAD se almacena dentro de .git/HEAD y contiene los 40 bytes SHA-1 de la confirmación actual.

detached HEAD

Si no está en la última confirmación, lo que significa que HEAD está apuntando a una confirmación previa en la historia, se llama detached HEAD .

En la línea de comando, se verá así: SHA-1 en lugar del nombre de la rama ya que HEAD no apunta a la punta de la rama actual

Algunas opciones sobre cómo recuperarse de un HEAD separado:

git checkout

git checkout <commit_id> git checkout -b <new branch> <commit_id> git checkout HEAD~X // x is the number of commits t go back

Esto verificará la nueva rama que apunta a la confirmación deseada.
Este comando pagará a un commit dado.
En este punto, puede crear una rama y comenzar a trabajar desde este punto en adelante.

# Checkout a given commit. # Doing so will result in a `detached HEAD` which mean that the `HEAD` # is not pointing to the latest so you will need to checkout branch # in order to be able to update the code. git checkout <commit-id> # create a new branch forked to the given commit git checkout -b <branch name>

git reflog

Siempre puedes usar el reflog también.
git reflog mostrará cualquier cambio que haya actualizado el HEAD y al verificar la entrada de reflog deseada, el HEAD volverá a esta confirmación.

Cada vez que se modifique el HEAD habrá una nueva entrada en el reflog

git reflog git checkout HEAD@{...}

Esto lo llevará de regreso a su compromiso deseado

git reset --hard <commit_id>

"Mueva" su CABEZA de nuevo a la confirmación deseada.

# This will destroy any local modifications. # Don''t do it if you have uncommitted work you want to keep. git reset --hard 0d1d7fc32 # Alternatively, if there''s work to keep: git stash git reset --hard 0d1d7fc32 git stash pop # This saves the modifications, then reapplies that patch after resetting. # You could get merge conflicts if you''ve modified things which were # changed since the commit you reset to.

  • Nota: ( desde Git 2.7 )
    También puede usar el git rebase --no-autostash también.

git revert <sha-1>

"Deshacer" el compromiso o rango de compromiso dado.
El comando reset "deshacerá" cualquier cambio realizado en el commit dado.
Se confirmará una nueva confirmación con el parche de deshacer, mientras que la confirmación original también permanecerá en el historial.

# add new commit with the undo of the original one. # the <sha-1> can be any commit(s) or commit range git revert <sha-1>

Este esquema ilustra qué comando hace qué.
Como puede ver allí, reset && checkout modifica el HEAD .


Aquí hay un enfoque que puede ser muy simple y fácil de recordar. Verifique 2 condiciones y termine con 1 comando. Entonces estás de vuelta en el camino.

Si

estás en ''cabeza separada''
(es decir, escriba el git status ; verá HEAD detached at <commit_id> )

Y

una sucursal existente se adapta a sus necesidades
(es decir, escriba git branch -v ; verá un nombre de rama con mensajes de confirmación relacionados que representan el trabajo que desea continuar)

Entonces

simplemente echa un vistazo a esa rama (es decir, escribe git checkout <branch_name> ; verás Switched to branch <branch_name>

Resultados

Ahora puede continuar agregando y comprometiendo su trabajo como antes; los cambios se rastrearán en <branch_name>

Tenga en cuenta que si ha guardado el trabajo mientras HEAD estaba desconectado, en la mayoría de los casos ese trabajo se fusionará automáticamente en el proceso anterior. Si ve un mensaje sobre un conflicto de fusión, no se asuste. Hay varios tutoriales geniales con pasos simples para solucionar el conflicto y completar la fusión.


Cuando ejecuta el comando git checkout commit_id luego HEAD se desconecta de 13ca5593d(say commit-id) y la rama estará disponible por más tiempo.

Vuelva a la ubicación anterior, ejecute el paso de comando: a) git pull origin branch_name (decir maestro) b) git checkout branch_name c) git pull origin branch_name

Volverá a la ubicación anterior con la confirmación actualizada desde el repositorio remoto.


Hacer

git reset 23b6772

Para ver si estás en la posición correcta:

git status

Verás algo

En la rama maestra Su rama está detrás de ''origen / maestro'' en 17 confirmaciones, y puede reenviarse rápidamente.

Luego arregle el HEAD al commit actual:

git push --force


Hoy, por error compruebo un commit y empiezo a trabajar en él, realiza algunos commits en el estado de HEAD. Luego, lo que hice lo empujé a la rama remota usando el siguiente comando

git push origin HEAD: <My-remote-branch>

entonces

git checkout <My-remote-branch>

entonces

git pull

Finalmente obtengo todos mis cambios en mi rama que hice en separar HEAD


La pregunta se puede leer como:

Estaba en estado separado con HEAD en 23b6772 y 23b6772 git reset origin/master (porque quería aplastar). Ahora que he cambiado de opinión, ¿cómo vuelvo a HEAD estando en 23b6772 ?

La respuesta directa es: git reset 23b6772

Pero respondí a esta pregunta porque me cansé de escribir (copiar y pegar) hashes de confirmación o su abreviatura cada vez que quería hacer referencia al HEAD anterior y buscaba en Google para ver si había algún tipo de taquigrafía.

Resulta que hay!

git reset - (o en mi caso git cherry-pick - )

Que, por cierto, era lo mismo que cd - volver al directorio actual anterior en * nix! Así que hurra, aprendí dos cosas de un tiro.