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 elgit 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.