El comando Git checkout en Git
Lección 26 / 53
Git Guía Git Guía Git español
Git no ofrece funciones de "deshacer" similares a las de programmi consumer, pero ofrece diferentes comandos que permiten volver sobre sus pasos y administrar la secuencia de commit en la historia como si fuese una máquina del tiempo.
El comando Git checkout en Git
Sabemos que Git almacena una serie de snapshot de un proyecto llamados commit, cada commit tiene su propio identificador y apunta al commit anterior, para poder reconstruir todo el historial. También sabemos que Git te permite tener una o más "líneas de tiempo", llamadas branch, que eventualmente se ramifican a partir de una commit común determinada.
Cojamos el caso de un repository con un solo branch, llamado main, donde hemos ejecutado algunos commit.
[17452bb93]<---[88adbcdf6]<---[fe78029f1]<---[6d9c22a3b]::{main}
|
|
HEAD
En esta situación Git mantiene una referencia simbólica llamada HEAD que dice que está mostrando nuestra working copy. Por lo general, HEAD apunta a un branch (es decir a su “punta”).
El comando git checkout en Git permite decidir qué extraer en la working copy, ya sea un branch, una etiqueta u otra referencia válida, como un commit, por ejemplo. De esta forma, es posible recuperar un snapshot específico del proyecto en la working copy, "retrocediendo en el tiempo" hasta el momento en que se guardó esa snapshot.
En el momento en el que se efectúa el git checkout de un específico commit o tag, Git muestra un aviso que al principio podría asustar:
$ git checkout 88adbcdf6
Note: switching to '88adbcdf6'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:
git switch -c <new-branch-name>
Or undo this operation with:
git switch -
Turn off this advice by setting config variable advice.detachedHead to false
HEAD is now at 88adbcdf6 Change behavior
Es decir, en comparación con el gráfico anterior, la situación ha cambiado de la siguiente manera:
[17452bb93]<---[88adbcdf6]<---[fe78029f1]<---[6d9c22a3b]::{main}
|
|
HEAD
Dado que HEAD apunta directamente a un commit, Git advierte que la working copy está en un estado detached. Por lo tanto, cualquier commit posterior no se agregará al branch principal. El mensaje indica cómo, si es necesario, crear un nuevo branch o volver al branch inicial usando el comando git switch.
Sin embargo, es posible usar el comando git checkout nuevamente para volver al branch inicial:
$ git checkout main
Previous HEAD position was 88adbcdf6 Change behavior
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
Si hubiéramos creado commit mientras estamos en el estado detached y luego hubiéramos regresado al branch main, tendríamos:
[800e2aa6]<---[fae892ce]
/
[17452bb93]<---[88adbcdf6]<---[fe78029f1]<---[6d9c22a3b]::{main}
|
|
HEAD
En esta situación, no se ha creado ninguna referencia al commit fae892ce (es decir, no se ha creado ningun branch nuevo) y Git eliminará este commit (y, por extensión, también el commit 800e2aa6) a través de sus procesos de rutina.
Resumiendo, podemos decir entonces que git checkout:
- sirve principalmente que queremos “cargar” en nuestra working copy
- normalmente, se usa para indicar el branch que queremos “cargar” en la working copy (en este caso los commit sucesivos están enganchados al branch actual): git checkout <NOMBRE_BRANCH>
- se puede utilizar para indicar un específico commit, a través de su id o un tag, para “cargar” en la working copy (en este caso se entra en el modo desprendido de cada branch): git checkout <COMMIT_O_TAG>
Veremos, en un capítulo posterior, cómo trabajar creando branch para separar desarrollos futuros, en particular, cómo "mover" commit de un branch a otro.
Anterior
25 El comando Git blame..Siguiente
27 El comando Git rever..