W3docs

git switch

Scopri il comando git switch — il modo moderno per cambiare e creare branch. Differenze rispetto a git checkout, con esempi pratici.

Definizione

Il comando git switch cambia il branch su cui stai lavorando. Introdotto in Git 2.23, è stato ricavato dal sovraccaricato comando git checkout per svolgere un solo compito in modo chiaro: spostare HEAD su un altro branch e aggiornare la working tree di conseguenza. Tutto ciò che riguarda il ripristino dei file si trova ora in git restore, quindi switch rimane concentrato esclusivamente sui branch.

Questa pagina tratta come passare a un branch esistente, creare un branch al volo, fare checkout di un branch remoto, portare le modifiche non committate, tornare indietro con - e le differenze tra git switch e git checkout.

git switch che sposta HEAD da un branch all'altro

Perché esiste git switch

Per anni, git checkout ha gestito due compiti non correlati: cambiare branch e ripristinare file nella working tree. Questo sovraccarico rendeva facile perdere lavoro per errore — git checkout <file> scartava silenziosamente le modifiche, mentre git checkout <branch> ti spostava in un nuovo posto. Git 2.23 ha diviso le responsabilità in modo che ogni comando sia prevedibile: git switch si sposta tra i branch, e git restore recupera i file. Entrambi sono stati introdotti insieme proprio per questo motivo. git checkout non è deprecato e funziona ancora, ma per il lavoro quotidiano sui branch git switch è più chiaro e sicuro.

Passare a un branch esistente

Per spostarti su un branch che esiste già, indicane il nome:

git switch feature

HEAD ora punta a feature, e la tua directory di lavoro riflette l'ultimo commit di quel branch. Se hai modifiche non committate che verrebbero sovrascritte, Git si ferma e ti avvisa invece di eliminare il lavoro.

Creare e cambiare branch in un solo passaggio

Usa il flag -c (create) per creare un nuovo branch e spostarti su di esso immediatamente:

git switch -c new-feature

Questo è l'equivalente moderno di git checkout -b new-feature. Puoi anche basare il nuovo branch su un punto di partenza specifico:

git switch -c hotfix main

Qui main è il punto di partenza: il nuovo branch hotfix inizia dallo stesso commit di main, ma i due divergono poi in modo indipendente. Il punto di partenza può essere qualsiasi nome di branch, tag o hash di commit.

Fare checkout di un branch remoto

Un caso molto comune è iniziare a lavorare su un branch che esiste sul remote ma non ancora in locale — ad esempio dopo che un collega ha fatto push di un branch feature. Se il nome è inequivocabile, basta passare ad esso:

git fetch
git switch feature

Git vede che non esiste un branch feature locale, trova un unico origin/feature e crea automaticamente un feature locale che lo traccia. Questa funzionalità è il comportamento --guess, attivo per impostazione predefinita. Per essere espliciti, o quando più remote hanno un branch con lo stesso nome, specifica tu stesso il branch di tracking:

git switch -c feature --track origin/feature
Informazione

Esegui prima git fetch. git switch può trovare solo un branch remoto che il tuo repository locale già conosce; il fetch aggiorna quell'elenco.

Portare le modifiche non committate su un altro branch

Per impostazione predefinita, cambiare branch con modifiche non committate va bene a patto che tali modifiche non entrino in conflitto con il branch di destinazione — Git le mantiene nella tua working tree. Se verrebbero sovrascritte, Git rifiuta e te lo comunica. Per portare deliberatamente modifiche locali in conflitto e unirle nel nuovo branch, aggiungi -m (--merge):

git switch -m other-branch

Se preferisci mettere da parte le modifiche e riapplicarle in seguito, usa git stash invece di forzare il cambio.

Opzioni comuni

ComandoDescrizione
git switch <branch>Passa a un branch esistente.
git switch -c <branch>Crea un nuovo branch e passa ad esso.
git switch -c <branch> <start-point>Crea un branch da un commit o branch specificato e passa ad esso.
git switch -Torna al branch precedentemente estratto.
git switch -c <branch> --track <remote>/<branch>Crea un branch locale di tracking da un branch remoto.
git switch --detach <commit>Estrae direttamente un commit in stato detached HEAD.
git switch -m <branch>Cambia branch, unendo le modifiche locali in conflitto nel branch di destinazione.
git switch -C <branch>Crea il branch, o lo reimposta se esiste già, poi passa ad esso.
git switch --orphan <branch>Avvia un nuovo branch senza cronologia e con una working tree vuota.

Tornare al branch precedente

Un singolo trattino ti riporta al branch su cui eri prima:

git switch -

Questo è comodo quando si alternano due branch e non si vuole digitare i loro nomi ripetutamente.

Esaminare un commit senza branch

Per osservare un vecchio commit senza spostare alcun branch, usa --detach. Questo ti mette in stato detached HEADHEAD punta direttamente a un commit invece che a un nome di branch:

git switch --detach 8f4c2a1

Puoi navigare e persino compilare da qui, ma i nuovi commit non sono collegati a un branch e possono essere persi una volta che cambi branch. Se decidi di mantenerli, crea prima un branch con git switch -c <name>.

git switch vs git checkout

Entrambi i comandi possono cambiare branch, quindi perché preferire switch? Perché non può toccare i file per errore. git checkout accetta sia nomi di branch che percorsi di file, il che significa che un errore di battitura può sovrascrivere silenziosamente il tuo lavoro. git switch si occupa esclusivamente di branch; se vuoi scartare le modifiche a un file, usi il chiaramente nominato git restore.

# Old, overloaded way
git checkout main
git checkout -b feature

# Modern, explicit way
git switch main
git switch -c feature

Nota che una cosa che git checkout può fare e git switch non può è operare sui file (git checkout -- file.txt). Questo è intenzionale: le operazioni sui file appartengono ora a git restore.

Comandi correlati

  • git checkout — il vecchio comando multiuso che switch e restore hanno sostituito.
  • git restore — scarta o recupera le modifiche ai file nella working tree.
  • git branch — elenca, crea, rinomina ed elimina branch.
  • git merge — combina il lavoro da un altro branch una volta che sei tornato al branch principale.
  • git stash — accantona le modifiche non committate prima di cambiare branch.

Esercitazione

Pratica
Quali affermazioni su 'git switch' sono corrette?
Quali affermazioni su 'git switch' sono corrette?
Was this page helpful?