domenica 16 novembre 2025

Git: Passare ad un branch esistente

Per passare a un branch esistente si utilizza il comando tradizionale:
git checkout <branch>
Ad esempio, per spostarsi sul branch Test:
git checkout Test

L’operazione sposta il puntatore HEAD affinché punti al branch Test attivo: da quel momento, eventuali commit modificheranno il branch Test.

git checkout
FIG 1 - git checkout



Effetti del cambio di branch

  • HEAD punta al branch attivo
    Dopo git checkout test, HEAD non punta direttamente a un commit ma al riferimento simbolico del branch Test (es. HEAD -> Test). Il commit successivo aggiornerà il puntatore Test al nuovo commit.
  • Modifiche alla working directory
    Al cambio di branch Git aggiorna i file nella working directory per riflettere lo snapshot dell’ultimo commit del branch di destinazione. Se le variazioni locali impediscono un passaggio netto (ad es. file modificati che verrebbero sovrascritti), Git impedisce lo switch e segnala il conflitto.
  • Creazione di nuovi commit sul branch attivo
    Dopo il checkout, un commit (ad esempio git commit -a -m 'Modifica readme
    ') avanzerà esclusivamente il puntatore del branch attivo, lasciando gli altri branch invariati. Di conseguenza, è possibile creare storie divergenti in modo isolato su differenti branch (FIG 2).

Commit su Branch Test
FIG 2 - Commit su Branch Test

Esempio di flusso operativo

Creazione branch (senza switch):
git branch Test


Switch al branch Test:
git checkout Test

Modifica e commit su Test:
vim readme.txt
git commit -a -m "Modifica readme"



Commit su nuovo branch
FIG 3 - Commit su nuovo branch

Ritorno a master:
git checkout master
Cambio Branch. HEAD su master
FIG 4 - Cambio Branch. HEAD su master

Questo riporta HEAD su master e ripristina i file alla versione indicata da master.


Divergenza della cronologia e visualizzazione

Quando si effettua lavoro parallelo su due branch differenti (ad esempio Test e master), la cronologia si diverge; successivamente le due linee potranno essere unite tramite merge o rebase. Per ispezionare la storia completa e visualizzare i punti di divergenza è utile il comando:

git log --oneline --decorate --graph --all

git log
FIG 5 - git log

Note operative e avvisi importanti

git log non mostra sempre tutti i branch: per default git log visualizza la storia a partire dal commit riferito dal branch attualmente selezionato. Per vedere la storia di un branch specifico usare git log <branch>; per mostrare tutti i branch usare --all.

Cambiare branch modifica i file sul disco: switching ripristina la working directory allo snapshot dell’ultimo commit del branch scelto. Se Git non è in grado di effettuare queste modifiche senza perdita di dati locali, il comando verrà rifiutato.

Comportamento con modifiche non committate:

  • Se si hanno modifiche locali non committate che non confliggono con i contenuti del branch di destinazione, Git generalmente permette lo switch mantenendo le modifiche.
  • Se ci sono conflitti, Git bloccherà lo switch: in tal caso è necessario committare, stashare (git stash) o ripristinare (git restore) le modifiche prima di procedere.
Operazione atomica di creare+switch: è possibile creare un nuovo branch e passare a esso con un solo comando: 
git checkout -b <newbranch>
oppure, nelle versioni moderne di Git (≥ 2.23), usando git switch:
git switch -c <newbranch>


git switch (comandi raccomandati nelle versioni moderne)

A partire da Git 2.23 è consigliato usare git switch per le operazioni di cambio branch (più leggibile e focalizzato rispetto al multitool git checkout):

  • Passare a un branch esistente:
    git switch Test
  • Creare un nuovo branch e passare a esso:
    git switch -c new-branch
    oppure
    git switch --create new-branch
  • Tornare al branch precedentemente attivo:
    git switch -

git switch separa chiaramente le semantiche di “cambio branch” da quelle di “ripristino file” che git checkout tradizionalmente confliggeva.


Best practice

  • Non lavorare su main/master direttamente — usare feature branch (feature/…), bugfix branch (bugfix/…) o hotfix branch (hotfix/…) per isolare il lavoro.
  • Eseguire commit atomici e frequenti: commit logici e piccoli rendono il merge e il debug più semplici.
  • Sincronizzare spesso con il remoto (git fetch + git merge/rebase) prima di iniziare un lavoro esteso, per ridurre la probabilità di conflitti.
  • Usare git switch quando possibile per migliorare chiarezza e sicurezza delle operazioni.
  • Usare git stash per mettere temporaneamente da parte modifiche non ancora pronte se è necessario effettuare uno switch immediato.
  • Visualizzare la storia con grafo (git log --oneline --decorate --graph --all) per avere un quadro completo delle divergenze e dei punti di merge.


Sintesi rapida dei comandi

OperazioneComando
Creare un branch senza switchgit branch Test
Creare e switchare (una riga)git checkout -b Test / git switch -c Test
Switchare su branch esistentegit checkout Test / git switch Test
Tornare all'ultimo branchgit checkout - / git switch -
Visualizzare grafo completogit log --oneline --decorate --graph --all
Mettere da parte modifiche non committategit stash push -m "work-in-progress"
Ripristinare stashgit stash pop




Nessun commento:

Posta un commento

I messaggi sono soggetti a moderazione da parte dell'amministratore prima della loro pubblicazione.