En Git, estaba tratando de hacer una squash commit
fusión en otra rama y luego restablecer HEAD
el lugar anterior a través de:
git reset origin/master
Pero necesito salir de esto. ¿Cómo puedo mover HEAD a la ubicación anterior?
Tengo el fragmento SHA-1 ( 23b6772
) del commit al que necesito moverlo. ¿Cómo puedo volver a este commit?
git
git-checkout
git-reset
git-revert
git-reflog
timpone
fuente
fuente
git checkout 23b6772
debería hacer.Respuestas:
Antes de responder, agreguemos algunos antecedentes, explicando de qué se
HEAD
trata.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 (excluyendogit worktree
).El contenido de
HEAD
se almacena dentro.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
apunta a una confirmación previa en el historial se llamadetached HEAD
.En la línea de comando, se verá así: SHA-1 en lugar del nombre de la rama ya
HEAD
que no apunta a la punta de la rama actual:Algunas opciones sobre cómo recuperarse de un HEAD separado:
git checkout
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 a partir de este punto.
git reflog
Siempre puedes usar el
reflog
también.git reflog
mostrará cualquier cambio que haya actualizadoHEAD
y revisando la entrada de reflog deseada establecerá elHEAD
respaldo de este commit.Cada vez que se modifique el HEAD habrá una nueva entrada en el
reflog
Esto lo llevará de regreso a su compromiso deseado
git reset --hard <commit_id>
"Mueva" su CABEZA de nuevo a la confirmación deseada.
git rebase --no-autostash
.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.
Este esquema ilustra qué comando hace qué.
Como puede ver allí,
reset && checkout
modifique elHEAD
.fuente
Hacer
Para ver si estás en la posición correcta:
Verás algo
Luego, vuelva a escribir el historial en su control remoto para reflejar el cambio:
fuente
git push --force
. En muchas situaciones, te convertirá en la persona menos popular del equipo por un tiempo ...git push --force-with-lease
(artículo de Thoughtbot : thoughtbot.com/blog/git-push-force-with-lease )revert
Como las fusiones no reaccionan de la misma manera que los commits, me encontré en una situación increíblemente difícil.force-with-lease
me dio la confianza para reescribir la historia git de la sucursal sin afectar el trabajo de otras personas. ¡Bravo!La solución más rápida posible (solo 1 paso)
Utilizar
git checkout -
Ya veras
Switched to branch <branch_name>
. Confirme que es la rama que desea.Breve explicación: este comando moverá HEAD nuevamente a su última posición. Ver nota sobre resultados al final de esta respuesta.
Mnemónico: este enfoque es muy similar a usar
cd -
para volver a su directorio visitado anteriormente. La sintaxis y los casos aplicables coinciden bastante bien (por ejemplo, es útil cuando realmente desea que HEAD regrese a donde estaba).Solución más metódica (2 pasos, pero memorable)
El enfoque rápido resuelve la pregunta del OP. Pero qué pasa si su situación es ligeramente diferente: digamos que ha reiniciado Bash y luego se encontró con HEAD desconectado. En ese caso, aquí hay 2 pasos simples y fáciles de recordar.
1. Elige la rama que necesitas
Utilizar
git branch -v
Verá una lista de sucursales locales existentes. Tome el nombre de la sucursal que se adapte a sus necesidades.
2. Mueva la CABEZA a ella
Utilizar
git checkout <branch_name>
Ya veras
Switched to branch <branch_name>
. ¡Éxito!Resultados
Con cualquiera de los métodos, ahora puede continuar agregando y comprometiendo su trabajo como antes: se realizará un seguimiento de sus próximos cambios
<branch_name>
.Tenga en cuenta que ambos
git checkout -
ygit checkout <branch_name>
darán instrucciones adicionales si ha cometido cambios mientras HEAD estaba desconectado.fuente
git checkout 8acc968
a continuación,git branch -v
tieneMyBranch
en la lista de abajo ... pero luegogit checkout MyBranch
borra mis comentarios.git checkout 8acc968
verificará una confirmación, no una rama. SiMyBranch
tiene los commits que desea, intentegit checkout MyBranch
. Si no contiene los cambios en commit 8acc968, deberá fusionar esos cambios después de verificar la rama.git checkout
para ver una confirmación anterior y quería volver a la última confirmación. Pero sin el último hash de commit, estaba bastante perdido. ¡Esta solución es perfecta para mi situación!La pregunta se puede leer como:
Estaba en estado separado con
HEAD
at23b6772
y tecleadogit reset origin/master
(porque quería aplastar). Ahora que he cambiado de opinión, ¿cómo vuelvo aHEAD
estar en23b6772
?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 a la anterior
HEAD
y buscaba en Google para ver si había algún tipo de taquigrafía.Resulta que hay!
git reset -
(o en mi casogit cherry-pick -
)Que, por cierto, fue lo mismo
cd -
que volver al directorio actual anterior en * nix! Así que hurra, aprendí dos cosas de un tiro.fuente
Cuando ejecuta el comando
git checkout commit_id
, HEAD se desconecta13ca5593d(say commit-id)
y la rama estará disponible por más tiempo.Vuelva a la ubicación anterior, ejecute el paso de comando sabio:
git pull origin branch_name
(decir maestro)git checkout branch_name
git pull origin branch_name
Volverá a la ubicación anterior con una confirmación actualizada desde el repositorio remoto.
fuente
Hoy, erróneamente verifiqué un commit y comencé a trabajar en él, haciendo algunos commits en un estado de HEAD separado. Luego empujé a la rama remota usando el siguiente comando:
Luego
Luego
Finalmente obtuve todos mis cambios en mi rama que hice en separar HEAD.
fuente
Puede que no sea una solución técnica, pero funciona. (si alguien de tu compañero de equipo tiene la misma sucursal en local)
Asumamos el nombre de su sucursal como branch-xxx .
Pasos para resolver:
Nota: Nuevamente, esta no es una solución técnica, pero seguramente ayudará.
fuente