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.
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 featureHEAD 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-featureQuesto è 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 mainQui 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 featureGit 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/featureEsegui 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-branchSe preferisci mettere da parte le modifiche e riapplicarle in seguito, usa git stash invece di forzare il cambio.
Opzioni comuni
| Comando | Descrizione |
|---|---|
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 HEAD — HEAD punta direttamente a un commit invece che a un nome di branch:
git switch --detach 8f4c2a1Puoi 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 featureNota 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
switcherestorehanno 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.