Refs, HEAD, reflog y tags internos
Las referencias son la capa humana encima de los objetos. Sin refs, tendrias hashes. Con refs, tienes ramas, tags, remotos y una forma mucho mas comoda de navegar.
Que es una ref
Una ref es un nombre que apunta a un commit u objeto.
Ejemplos:
refs/heads/main
refs/heads/feature/login
refs/remotes/origin/main
refs/tags/v1.0.0Ver todas:
git show-refRamas locales
Una rama local vive normalmente en .git/refs/heads/.
git branch
git rev-parse mainCrear una rama solo crea un puntero:
git branch feature/loginCambiar de rama actualiza HEAD y el working tree:
git switch feature/loginHEAD
Ver HEAD:
git symbolic-ref HEAD
git rev-parse HEADEn una rama normal:
HEAD -> refs/heads/main -> commitEn detached HEAD:
HEAD -> commitDetached HEAD
Puedes entrar en detached HEAD al revisar un commit antiguo:
git switch --detach HEAD~3Si haces commits ahi y quieres conservarlos:
git switch -c experimento-rescatadoRefs remotas
origin/main no es la rama remota en vivo. Es tu ultima copia conocida de la rama remota.
Actualizar referencias remotas:
git fetch originComparar:
git log --oneline --decorate --graph main origin/main
git diff main origin/mainTracking branch
Una rama local puede seguir una rama remota.
git branch -vvConfigurar tracking:
git branch --set-upstream-to=origin/main mainCuando hay tracking, git pull sabe de donde traer cambios y git push sabe a donde subir.
Reflog
El reflog registra movimientos recientes de HEAD y ramas locales.
git reflog
git reflog show mainEs una red de recuperacion para operaciones como:
resetrebasecommit --amend- cambios de rama
- merges fallidos
Recuperar con reflog
Si perdiste un commit:
git reflog
git branch rescate abc1234Si quieres volver la rama al estado anterior:
git reset --hard abc1234Usa reset --hard solo cuando tienes claro que quieres descartar cambios del working tree.
Tags ligeros y anotados
Tag ligero:
git tag v1.0.0Tag anotado:
git tag -a v1.0.0 -m "Version 1.0.0"Los tags anotados crean un objeto tag con metadatos.
Publicar tags
git push origin v1.0.0
git push origin --tagsEvita publicar todos los tags si no estas seguro. En proyectos grandes puede subir tags antiguos o experimentales.
Borrar tags
Local:
git tag -d v1.0.0Remoto:
git push origin :refs/tags/v1.0.0Diagrama de refs
flowchart LR
H["HEAD"] --> M["refs/heads/main"]
M --> C3["commit C"]
O["refs/remotes/origin/main"] --> C2["commit B"]
T["refs/tags/v1.0.0"] --> C1["commit A"]
C3 --> C2
C2 --> C1Buenas practicas
- Ejecuta
git fetchantes de comparar con remoto. - Usa
git branch -vvpara detectar ramas sin upstream. - Crea una rama de rescate antes de operaciones delicadas.
- Prefiere tags anotados para releases importantes.
- Revisa el reflog antes de asumir que un commit se perdio.
