5 comandi Git avanzati per migliorare il tuo gioco Git

Se sei uno sviluppatore oggi, è probabile che tu abbia imparato Git, il sistema di controllo della versione al centro dei flussi di lavoro del software moderno. Conosci le basi: come funzionano i repository, come creare rami e eseguire il commit delle modifiche e come unire tali modifiche e tirare le richieste.

Ma ora che conosci le basi, è tempo di salire di livello per sfruttare alcune delle funzionalità più potenti di Git nel tuo flusso di lavoro. Ecco cinque funzionalità Git avanzate per far parte dei tuoi sforzi di sviluppo attuali e futuri.

Semplifica le cronologie dei commit con git rebase

Quando si hanno due rami in un progetto (ad esempio un ramo di sviluppo e un ramo principale), entrambi con modifiche che devono essere combinate, il git mergecomando è il modo naturale e diretto per unificarli. A mergeaggiunge la cronologia di sviluppo di un ramo come commit di unione nell'altro. Sebbene ciò preservi entrambe le storie in dettaglio completo, può rendere difficile seguire la storia complessiva del progetto. In alcuni casi, potresti desiderare un risultato più semplice e pulito. 

Il git rebasecomando unisce anche due rami, ma lo fa in modo leggermente diverso. A git rebaseriscrive la cronologia di commit di un ramo in modo che l'altro ramo sia incorporato al suo interno dal punto in cui è stato creato. Ciò rende la cronologia di commit meno rumorosa e più lineare per quel ramo. Ma significa anche che i dettagli potenzialmente utili sull'altro ramo e sul processo di unione vengono rimossi. 

A tal fine, rebaseè meglio utilizzarlo quando si dispone di più rami privati che si desidera consolidare in un'unica cronologia di commit pulita prima di unirlo a un ramo pubblico. In questo modo, ottieni il massimo vantaggio di  rebaserendere la cronologia dei commit più lineare e meno rumorosa senza oscurare dettagli cruciali sulla cronologia dei commit nel tuo progetto.

Clean up si fonde con git merge --squash

Un altro modo per creare unioni e commit successivi meno rumorosi è utilizzare l' --squashopzione in git merge. --squashprende tutti i commit da un branch in entrata e li appiattisce in un unico commit consolidato.

Il bello di un'unione schiacciata è che puoi scegliere come applicare i file staged risultanti. Puoi semplicemente eseguire il commit dell'intero set di modifiche come una sola, oppure puoi eseguire il commit di alcuni file alla volta in cui le modifiche sono strettamente correlate. Un'unione schiacciata è utile anche se la cronologia di commit del ramo in entrata è utile solo nel contesto di quel ramo, o se proviene da un ramo privato che verrà comunque scartato.

Come con a rebase, questa tecnica funziona meglio per eseguire il commit dei rami interni da padroneggiare, ma è anche adatta per richieste pull, se necessario.

Accelera le ricerche di bug con git bisect

Sottili regressioni nel codice sono le più difficili da scoprire. Immagina di aver appena aggiunto un test alla tua base di codice per cercare un bug, ma non sei sicuro di quando il bug è apparso per la prima volta ... e hai centinaia o addirittura migliaia di commit nel tuo repository. Il  git bisect comando ti consente di ridurre notevolmente la quantità di codice che devi cercare per trovare il commit che ha creato il bug.

Quando abiliti bisect( git bisect start) specifichi due punti nella tua base di codice per delimitare la tua ricerca: uno in cui sai che le cose vanno male ( HEAD, in genere) e uno in cui sai che le cose erano ancora buone. bisectcontrollerà un commit a metà strada tra il commit sbagliato e quello buono e ti permetterà di eseguire i tuoi test. Questo processo di suddivisione binaria si ripete fino a quando non viene visualizzato il commit che ha rotto le cose.

git bisectè una manna dal cielo per codebase di grandi dimensioni con storie di commit lunghe e complesse, risparmiandoti la fatica di dover passare attraverso ogni commit nella speranza che prima o poi troverai il tuo bug. Al molto meno, si riduce della metà la quantità di ricerca e sperimentazione che devi fare.

Riapplica impegni con git cherry-pick

Molti gitcomandi avanzati sono utili solo in circostanze strettamente specifiche e ignorati in modo sicuro anche da utenti moderatamente avanzati. Ma quando ti imbatti in una di quelle circostanze specifiche, vale la pena conoscerle.

Considera git cherry-pick. Ti consente di prendere un determinato commit - qualsiasi commit, da qualsiasi ramo - e applicarlo a un ramo diverso, senza dover applicare altre modifiche dalla cronologia di quel commit. Questo è utile in alcune circostanze chiave:

  • Hai fatto un commit sul ramo sbagliato e vuoi applicarlo rapidamente a quello giusto.
  • Si desidera applicare una correzione da un ramo a un trunk prima di continuare con altri lavori sul codice trunk.

Nota che hai alcune opzioni oltre ad applicare direttamente il commit quando lo fai cherry-pick. Se passi l' --no-commitopzione, ad esempio, il commit selezionato viene posizionato nell'area di staging del ramo corrente. 

Organizza i progetti in modo elegante con i sottomoduli Git

Proprio come la maggior parte dei linguaggi di programmazione fornisce un modo per importare pacchetti o moduli, Git offre un modo per includere automaticamente i contenuti di un repository all'interno di un altro, un sottomodulo . È possibile creare una sottodirectory all'interno di un repository e popolarla automaticamente con il contenuto di un altro repository, in genere facendo riferimento a un hash di commit specifico per motivi di coerenza.

Nota che i sottomoduli Git funzionano meglio nelle seguenti condizioni:

  • I sottomoduli in questione non cambiano spesso o sono vincolati a un commit specifico. Qualsiasi lavoro su un sottomodulo, piuttosto che con un sottomodulo, dovrebbe essere gestito separatamente.
  • Tutti usano una versione di Git che supporta i sottomoduli e comprende i passaggi necessari per lavorare con loro. Ad esempio, le directory del sottomodulo non vengono sempre popolate automaticamente con i contenuti del repository del sottomodulo. Potrebbe essere necessario utilizzare il git submodule updatecomando nel repository per aggiornare tutto.