Articolo originale: Git Switch Branch – How to Change the Branch in Git

Cambiare branch è un'operazione di cui avrai bisogno spesso in Git.

Per farlo, puoi usare il comando git checkout.

Come creare un nuovo branch in Git

Per creare un nuovo branch in Git, puoi usare il comando git checkout e passare il flag -b seguito da un nome.

Questo creerà un nuovo branch partendo da quello corrente. La cronologia del nuovo branch inizierà con la posizione corrente del branch da cui hai lanciato il comando.

Assumendo di trovarsi sul branch chiamato master:

(master)$ git checkout -b my-feature
Switched to a new branch 'my-feature'
(my-feature)$

Qui puoi vedere un nuovo branch appena creato chiamato my-feature, che è stato generato come ramificazione a partire da master.

Come passare a un branch esistente in Git

Per passare a un branch esistente, puoi usare il comando git checkout (senza il flag  -b) e passare il nome del branch che vuoi raggiungere:

(my-feature)$ git checkout master
Switched to branch 'master'
(master)$

Esiste anche una pratica scorciatoia per ritornare al branch su cui ti trovavi precedentemente, passando - al comando git checkout invece del nome del branch:

(my-feature)$ git checkout -
Switched to branch 'master'
(master)$ git checkout -
Switched to branch 'my-feature'
(my-feature)$

Come eseguire il checkout di uno specifico commit

Per eseguire il checkout o passare ad un commit specifico, puoi anche usare  git checkout e passare come parametro lo SHA del commit invece del nome del branch.

Dopotutto, i branch sono effettivamente solo puntatori e rilevatori di specifici commit nella cronologia di Git.

Come trovare lo SHA di un commit

Un modo per trovare lo SHA di un commit è guardare nel log di Git.

Puoi visualizzare il log utilizzando il comando git log:

(my-feature)$ git log
commit 94ab1fe28727b7f8b683a0084e00a9ec808d6d39 (HEAD -> my-feature, master)
Author: John Mosesman <johnmosesman@gmail.com>
Date:   Mon Apr 12 10:31:11 2021 -0500

    This is the second commmit message.

commit 035a128d2e66eb9fe3032036b3415e60c728f692 (blah)
Author: John Mosesman <johnmosesman@gmail.com>
Date:   Mon Apr 12 10:31:05 2021 -0500

    This is the first commmit message.

Sulla prima riga di ciascun commit, dopo la parola commit si trova una lunga stringa di caratteri e di numeri: 94ab1fe28727...

Si tratta dello SHA, un identificatore unico che viene generato per ogni commit.

Per eseguire il checkout di un commit specifico, devi solo passare lo SHA del commit come parametro al comando git checkout:

(my-feature)$ git checkout 035a128d2e66eb9fe3032036b3415e60c728f692
Note: switching to '035a128d2e66eb9fe3032036b3415e60c728f692'.

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 035a128 a
((HEAD detached at 035a128))$
Nota: generalmente avrai bisogno di usare solo i primi caratteri dello SHA, poichè i primi quattro o cinque caratteri della stringa sono molto probabilmente unici in tutto il progetto.

Cosa vuol dire detached HEAD state?

Effettuare il checkout di uno specifico commit ti pone in un cosiddetto "detached HEAD state" (stato HEAD separato).

Dalla documentazione:

[detached HEAD state] significa semplicemente che HEAD si riferisce a uno specifico commit, invece che riferirsi a un branch con un nome.

Fondamentalmente, l'HEAD (uno dei puntatoti interni di Git che rileva dove ci si trova nella cronologia di Git) risulta separato dai branch conosciuti, così le modifiche, da questo punto, formeranno un nuovo percorso nella cronologia di Git.

Git vuole assicurarsi che questo stato HEAD separato sia quello che realmente vuoi ottenere, pertanto ti fornisce uno "spazio libero" per ogni sorta di modifica sperimentale - come descritto nell'output:

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.

Traduzione: "Sei in uno 'stato HEAD separato'. Puoi dare un'occhiata in giro, fare cambiamenti sperimentali e salvarli in commit, e puoi cancellare qualsiasi commit che hai fatto in questo stato, senza alcun impatto sui branch, tornando indietro su un branch esistente"

Da questo posizione hai due opzioni:

  • Sperimentare e poi buttare via le tue modifiche tornato al branch precedente
  • Lavorare da qui ed iniziare un nuovo branch da questo punto

Puoi usare il comando  git switch - per annullare qualsiasi modifica che hai apportato e tornare al tuo branch precedente.

Se invece vuoi mantenere i tuoi cambiamenti e continuare da qui, puoi usare il comando git switch -c <nome-nuovo-branch> per creare un nuovo branch da questo punto.

Conclusioni

Il comando git checkout è utile e ha molteplici usi.

Puoi usarlo per creare nuovi branch, spostarti su un branch, eseguire il checkout di uno specifico commit, e molto altro.

Se ti è piaciuto questo tutorial, parlo di argomenti come questi su Twitter e ne scrivo sul mio sito.