Il comando Git checkout in Git


Lezione 26 / 53

Il comando Git checkout in Git

Di Luca Ferretti


git guida git guida git italiano

Git non offre funzioni di “undo” simili a quello di programmi consumer, ma offre comunque diversi comandi che permettono di tornare sui propri passi e gestire la sequenza di commit nella history come se fosse una macchina del tempo.

Il comando Git checkout in Git

Sappiamo che Git memorizza una serie di snapshot di un progetto chiamati commit, ogni commit ha un suo identificativo e punta al commit precedente, in modo da ricostruire l’intera cronologia. Sappiamo anche che Git permette di avere una o più “linee temporali”, chiamate branch, che si diramano eventualmente a partire da un determinato commit comune.

Prendiamo il caso di un repository con un singolo branch, chiamato main, su cui abbiamo eseguito alcuni commit.

[17452bb93]<---[88adbcdf6]<---[fe78029f1]<---[6d9c22a3b]::{main}
                                                          |
                                                          |
                                                          HEAD

In questa situazione Git mantiene un riferimento simbolico chiamato HEAD che dice cosa sta mostrando la nostra working copy. Tipicamente, HEAD punta a un branch (ovvero alla sua “tip”).

Il comando git checkout in Git permette di decidere cosa estrarre nella working copy, sia esso un branch, un tag, o un altro riferimento valido, come per esempio un commit.
In questo modo è possibile recuperare nella propria working copy uno specifico snapshot del progetto, tornando quindi “indietro nel tempo” al momento in cui quello snapshot è stato salvato.

Nel momento in cui si effettua il git checkout di uno specifico commit o tag, Git mostra un avviso che potrebbe inizialmente spaventare:

$ 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

In pratica, rispetto al grafico precedente, la situazione è cambiata così:

[17452bb93]<---[88adbcdf6]<---[fe78029f1]<---[6d9c22a3b]::{main}
                        |
                        |
                        HEAD

Poiché la HEAD punta direttamente a un commit, Git avvisa che la working copy è in uno stato detached. In pratica, quindi, ogni eventuale commit successivo non verrà aggiunto al branch main. Il messaggio indica come, eventualmente, creare un nuovo branch o tornare al branch di partenza tramite il comando git switch.

È comunque possibile utilizzare nuovamente il comando git checkout per tornare al branch iniziale:

$ git checkout main
Previous HEAD position was 88adbcdf6 Change behavior
Switched to branch 'master'
Your branch is up to date with 'origin/master'.

Nel caso in cui avessimo creato dei commit mentre ci si trovava nello stato detached e fossimo poi tornati al branch main, avremmo

                           [800e2aa6]<---[fae892ce]
                          /
[17452bb93]<---[88adbcdf6]<---[fe78029f1]<---[6d9c22a3b]::{main}
                                                          |
                                                          |
                                                          HEAD

In questa situazione, non è stato creato alcun riferimento al commit fae892ce (cioè non è stato creato un nuovo branch) e Git provvederà a rimuovere tale commit (e per estensione anche il commit 800e2aa6) tramite suoi processi di routine.

Riassumendo, possiamo quindi dire che git checkout:

  • serve principalmente per indicare cosa vogliamo “caricare” nella nostra working copy
  • tipicamente, viene usato per indicare il branch che vogliamo “caricare” nella working copy (in questo caso i commit successivi sono agganciati al branch attuale): git checkout <NOME_BRANCH>
  • può essere utilizzato per indicare uno specifico commit, tramite il suo id o un tag, da “caricare” nella working copy (in questo caso si entra nella modalità sganciata da ogni branch): git checkout <COMMIT_O_TAG>

Vedremo, in un capitolo successivo, come lavorare creando branch per separare gli sviluppi futuri, in particolare come “spostare” commit da un branch a un altro.

Guida Git in italiano 1 Che cos'è Git? 2 Nascita di Git 3 Principali caratteristiche di Git 4 Riga di comando e UI in Git 5 Come Installare Git 6 5 comandi Git per sviluppatori singoli 7 5 comandi Git per sviluppare collaborando 8 Repository in Git 9 Commit in Git 10 Working Copy in Git 11 Staging Area in Git 12 Branch in Git 13 Remote in Git 14 Inizializzare un nuovo repository con git init 15 Creare una copia di un repository remoto in Git con git clone 16 Configurare le opzioni di Git con git config 17 Il comando Git add in Git 18 Il comando Git commit in Git 19 Il comando Git diff in Git 20 Il comando Git stash in Git 21 .gitignore : i file ignored in Git 22 Il comando Git status in Git 23 il comando Git log in Git 24 Il comando Git tag in Git 25 Il comando Git blame in Git 26 Il comando Git checkout in Git 27 Il comando Git revert in Git 28 Il comando Git reset in Git 29 Il comando Git rm in Git 30 L'opzione Git commit –amend in Git 31 Git rebase –interactive in Git 32 Scorciatoie per comandi frequenti in Git 33 Repository condiviso in Git 34 Il modello Fork & pull 35 Il comando Git remote in Git 36 I principali repository remote di Git: Github, Gitlab e Bitbucket 37 Il comando Git fetch in Git 38 Il comando Git push in Git 39 Il comando Git pull in Git 40 Il comando Git branch in Git 41 Il comando Git checkout in Git 42 Il comando Git merge in Git 43 Risolvere un merge conflict in Git 44 Capire meglio il contenuto dei commit durante un conflitto di merge in Git 45 Workflow Git centralizzato 46 Workflow Git feature branching 47 Workflow Git trunk-based 48 Approccio “forking” in Git 49 Gitflow in Git 50 Messaggi di commit in Git 51 Tagging & Versioning in Git 52 L’opzione merge in Git 53 L’opzione rebase in Git
Scopri i corsi

Le nostre guide possono essere molto utili per muovere i primi passi nel mondo della programmazione, ma se vuoi iniziare una nuova carriera in ambito digital & tech con il supporto costante dei docenti e tantissime esercitazioni pratiche, ti consigliamo di frequentare uno dei corsi della nostra Hackademy!

Scopri i corsi