El comando Git checkout en Git


Lección 26 / 53

El comando Git checkout en Git

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.

Guía Git en español 1 ¿Qué es Git? 2 Nacimiento de Git 3 Principales características de Git 4 Línea de comando UI en Git 5 Cómo instalar Git 6 5 comandos Git para desarrolladores individuales 7 5 comandos Git para desarrollar en colaboración 8 Repository en Git 9 Commit en Git 10 Working Copy en Git 11 Staging Area en Git 12 Branch en Git 13 Remote en Git 14 Inicializar un nuevo repository con git init 15 Crear una copia de un repository remoto en Git con git clone 16 Configurar las opciones de Git con git config 17 El comando Git add en Git 18 El comando Git commit en Git 19 El comando Git diff en Git 20 El comando Git stash en Git 21 .gitignore : los archivos ignored en Git 22 El comando Git status en Git 23 El comando Git log en Git 24 El comando Git tag en Git 25 El comando Git blame en Git 26 El comando Git checkout en Git 27 El comando Git revert en Git 28 El comando Git reset en Git 29 El comando Git rm en Git 30 La opción Git commit –amend en Git 31 Git rebase –interactive en Git 32 Atajos para comandos frecuentes en Git 33 Repository compartido en Git 34 El modelo Fork & pull 35 El comando Git remote en Git 36 Los principales repository remote de Git: Github, Gitlab y Bitbucket 37 El comando Git fetch en Git 38 El comando Git push en Git 39 El comando Git pull en Git 40 El comando Git branch en Git 41 El comando Git checkout en Git 42 El comando Git merge en Git 43 Resolver un merge conflict en Git 44 Entender mejor el contenido de los commit durante un conflicto de merge en Git 45 Workflow Git centralizado 46 Workflow Git feature branching 47 Workflow Git trunk-based 48 Enfoque “forking” en Git 49 Gitflow en Git 50 Mensajes de commit en Git 51 Tagging & Versioning en Git 52 La opción merge en Git 53 La opción rebase en Git

© 2022 Aulab. Todos los derechos reservados • P.IVA: IT07647440721 • Política de privacidad