Es posible que Git te haya mostrado alguna vez una advertencia del tipo «You are in ‘detached HEAD’ state» al intentar hacer un commit
o un push
. Lo que nos está diciendo Git es que el puntero HEAD
está apuntando directamente a un commit, en lugar de apuntar a una rama que apunte al commit.
Para solucionarlo creamos una nueva rama temporal y hacemos que apunte al último commit haciendo un checkout de ella:
git branch tmp
git checkout tmp
Movemos el puntero de la rama master al de nuestra nueva rama temporal:
git branch -f master tmp
git checkout master
Borramos la rama temporal, que ya no es necesaria:
git branch -d tmp
Y ya podemos hacer el commit o el push tranquilamente:
git push origin master
Hay muchos motivos por los que puedes llegar a un deatached HEAD y me da la sensación de que lo que hace es establecer que master apunte al commit actual donde estoy, cosa que puede ser correcto, o puede ser una modificacion del master inaceptable 🙁
Por ejemplo, si yo quiero moverme a un commit antiguo para investigar alg (git checkout master~10) y luego se me olvida y me quedo en esa rama y hago cosas, estoy en un deatached HEAD, pero si la establezco como master, estarán desapareciendo 10 commits del repo, además de tener que hacer un push -f para poder subirlo al servidor.
Creo que si lo que tienes es cambios, y los quieres llevar a master las opciones son:
1. si no esta commiteado, git stash, git checkout master, git stash pop)
2. si lo tienes comiteado, git log, apuntar los ids de los commits, git checkout master, git cherry-pick [ids de los commits].
Cierto, tienes razón. Quizás la entrada es demasiado simplista
De todos modos no entiendo muy bien que flujo te lleva a un Deatached HEAD que se solucione así.
Tienes algún ejemplo de esto? Creo que me ayudaría a entendererlo mejor.
Muchas gracias, me sirvió mucho. Yo estoy nuevo en esto del control de versiones y hace poco tuve un pequeño gran inconveniente, trabajo desde el IDE de visual Studio, y tienen un plug in para trabajar en git, la cuestión es que desde hace unas semana hacia commit no en una rama, sino en el propio commit y pues estaba este mensaje a la cabeza, cuando por pruebas decido apuntar a una rama anterior, la rama donde supuestamente yo estaba trabajando ya no aparecia por ningún lado. Creí que moriria. Graciaa a Dios encontré la forma de volver a traer este commit a al head y encontré este tutorial para volver a poner orden a mi proyecto.
Gracias me salvaste 😀
Sencillo y funcional.
¡Muchas gracias!
pasa cuando haces cambio en propietario de archivos y pierde control sobre .git/HEAD y .git/FETCH_HEAD . y se realiza un commit con otro usuario sin esos privilegios, entonces git crea un head temporal y este no tiene punto ORIGIN quedando fuera para hacer un push o un pull. en una rama temporal.
la otra es por hacer un git desde el proyecto con otro usuario y pasa lo mismo, cambia el propietario en mi caso root.
y al hacer un commit con otro usuario noroot este pierde el origin head .git/HEAD y .git/FETCH_HEAD y se crea la rama temporal que no puede hacer merge con el master.
git checkout -b temp //crear y cambiarte a la branch temp
git mege master // mezcla los cambios de master en el temp
(en caso de haber commits perdidos los trae)
git checkout master //cambiamos al master
git commit -m «full merge» //mezclamos el temp con el master por si quedo desactualizado algo.
git push -f origin master // sube todo forzado
eliminamos la branch temp git branch -d temp