Utilizzo dei branch

Git checkout

In questa pagina viene esaminato il comando git checkout. Saranno illustrati esempi d'uso e casi limite. In termini Git, un "checkout" (estrazione) è l'atto di passare da una versione all'altra di un'entità di destinazione. Il comando git checkout opera su tre entità distinte: file, commit e branch. Oltre alla definizione di "estrazione", il verbo "estrarre" è comunemente usato per implicare l'atto di eseguire il comando git checkout. Nell'argomento Annullamento delle modifiche, abbiamo visto come git checkout possa essere usato per visualizzare i commit meno recenti. Questo documento è incentrato per la maggior parte sulle operazioni di estrazione sui branch.

Eseguire il checkout dei branch è un'operazione simile al checkout dei commit e dei file meno recenti, in quanto la directory di lavoro viene aggiornata in modo da corrispondere al branch o alla revisione selezionati; tuttavia, le nuove modifiche vengono salvate nella cronologia del progetto (ovvero, non si tratta di un'operazione di sola lettura).

Esecuzione del checkout dei branch

Il comando git checkout permette di spostarsi tra i branch creati tramite git branch. Quando viene eseguito il checkout di un branch, i file nella directory di lavoro vengono aggiornati in modo da corrispondere alla versione memorizzata in quel branch e viene inviata a Git l'istruzione di registrare tutti i nuovi commit su tale branch. Pensa a questa operazione come a un modo per selezionare la linea di sviluppo su cui lavorare.

Avere una branch dedicato per ogni nuova funzione è un cambiamento radicale rispetto ai flussi di lavoro tradizionali di SVN. Rende estremamente facile fare nuovi esperimenti senza il timore di distruggere le funzioni esistenti e consente di lavorare su molte funzioni non correlate contemporaneamente. Inoltre, i branch agevolano anche diversi flussi di lavoro collaborativi.

Il comando git checkout può essere a volte confuso con git clone. La differenza tra i due comandi è che il comando clone recupera il codice da un repository remoto, mentre il comando checkout passa da una versione all'altra del codice già presente sul sistema locale.

Utilizzo: branch esistenti

Supponendo che il repository in cui stai lavorando contenga branch preesistenti, puoi passare da un branch all'altro usando git checkout. Per scoprire quali branch sono disponibili e qual è il nome del branch corrente, esegui git branch.

$> git branch 
main 
another_branch 
feature_inprogress_branch 
$> git checkout feature_inprogress_branch

L'esempio sopra mostra come visualizzare un elenco dei branch disponibili eseguendo il comando git branch e come passare a un branch specificato, in questo caso, feature_inprogress_branch.

Nuovi branch

git checkout funziona di pari passo con git branch. Il comando git branch può essere usato per creare un nuovo branch. Quando vuoi iniziare una nuova funzione, crei un nuovo branch da main tramite git branch new_branch. Una volta creato il branch, puoi usare git checkout new_branch per andare a tale branch. Inoltre, il comando git checkout accetta un argomento -b che funge da metodo pratico per creare il nuovo branch e passare immediatamente a quest'ultimo. Puoi lavorare su più funzioni in un unico repository passando da una all'altra con git checkout.

git checkout -b <new-branch>

L'esempio riportato sopra crea ed esegue simultaneamente il checkout di . L'opzione -b è un flag che comunica a Git di eseguire git branch prima di eseguire git checkout.

git checkout -b <new-branch> <existing-branch>

Per impostazione predefinita, git checkout -b baserà il new branch sull'HEAD corrente. Un parametro di branch aggiuntivo opzionale può essere inviato a git checkout. Nell'esempio riportato sopra, viene inviato existing-branch> che quindi basa new-branch su existing-branch, invece che sull'HEAD corrente.

Passaggio da un branch all'altro

Passare da un branch all'altro è un'operazione semplice. L'esecuzione di quanto segue consentirà di puntare HEAD alla punta di .

git checkout <branchname>

Git tiene traccia della cronologia delle operazioni di estrazione nel log di riferimento. Puoi eseguire git reflog per visualizzare la cronologia.

Esecuzione di git checkout su un branch remoto

Quando si collabora con un team è comune utilizzare repository remoti. Questi repository possono essere ospitati e condivisi oppure possono essere una copia locale di un altro collega. Ogni repository remoto conterrà il proprio set di branch. Per estrarre un branch remoto, devi prima recuperare il contenuto di tale branch.

git fetch --all

Nelle versioni moderne di Git, puoi quindi estrarre il branch remoto come faresti con un branch locale.

git checkout <remotebranch>

Le versioni precedenti di Git richiedono la creazione di un nuovo branch basato su remote.

git checkout -b <remotebranch> origin/<remotebranch>

Inoltre, è possibile estrarre un nuovo branch locale e reimpostarlo sull'ultimo commit dei branch remoti.

git checkout -b <branchname>
git reset --hard origin/<branchname>

HEADS scollegati

Ora che abbiamo visto i tre usi principali di git checkout sui branch, è importante parlare dello stato "detatched HEAD". Ricorda che HEAD è il modo utilizzato in Git per fare riferimento alla snapshot corrente. Internamente, il comando git checkout aggiorna semplicemente l'HEAD in modo che punti al branch o al commit specificato. Quando punta a un branch, in Git non si verificano errori, se invece selezioni un commit, Git passa allo stato "detatched HEAD".

Questo è un avviso che ti informa che le attività che stai svolgendo sono "scollegate" dal resto dello sviluppo del progetto. Se dovessi iniziare a sviluppare una funzione mentre sei nello stato con HEAD scollegato, non ci sarebbe alcun branch che ti consenta di tornare alla funzione. Quando inevitabilmente esegui il checkout di un altro branch (ad esempio, per eseguire il merge della funzione), non ci sarebbe modo di fare riferimento alla funzione:

Confronto tra head collegato e head scollegato

Il punto è che le attività di sviluppo dovrebbero sempre avvenire su un branch e mai su un HEAD scollegato. In questo modo, potrai assicurarti di avere sempre un riferimento per i nuovi commit. Tuttavia, se stai solo guardando un commit meno recente, non importa se ti trovi nello stato con HEAD scollegato o meno.

Riepilogo

Questa pagina è incentrata sull'utilizzo del comando git checkout durante la modifica dei branch. In sintesi, git checkout, se usato sui branch, altera la destinazione del riferimento HEAD. Può essere utilizzato per creare branch, passare da un branch all'altro ed estrarre i branch remoti. Il comando git checkout è uno strumento essenziale per il funzionamento standard di Git. È l'equivalente di git merge. I comandi git checkout e git merge sono strumenti fondamentali dei flussi di lavoro Git.

Proviamo a creare dei branch?

Prova questo tutorial interattivo.

Inizia ora