Skip to main content

Git meme

Git è molto semplice da utilizzare, vero?

git commit e git push
git commit e git push

e così via, il tuo progetto prende forma ed è anche su GitHub, fantastico!

Poi inizi a lavorare in un team, magari per quella software house che hai tanto desiderato. È finalmente il momento di presentare la tua prima Pull Request, sei così preoccupato della bontà del codice che hai scritto che non hai dato il minimo peso al versionamento, tanto “è solo git, che sarà mai?”.

Ma aspetta, devo fare pull prima di fare push?
Google dice che dovrei fare rebase o qualcosa del genere…
Perchè ho perso tutte le modifiche??
COSA CAZZO STA SUCCEDENDO??

Se vuoi evitare di fare figuracce come la maggior parte dei nuovi assunti, stupisci il tuo Lead padroneggiando Git con l’aiuto di questa guida!

Comandi Base di Git

Prima di tuffarci nelle funzioni avanzate, ricordiamo brevemente i comandi fondamentali su cui si basa l’uso quotidiano di Git:

  • git init: inizializza un nuovo repository Git.
  • git clone: clona un repository esistente in una nuova directory.
  • git checkout: passa a un altro branch o ripristina i file dell’area di lavoro.
  • git add: aggiunge i file modificati all’indice (staging area).
  • git commit: salva le modifiche nell’indice nel repository locale.
  • git push: invia le modifiche al repository remoto.
  • git pull: aggiorna il repository locale con la versione più recente dal repository remoto.
  • git merge: unisce più cronologie di sviluppo insieme.

Se non sei ancora familiare con questi comandi, ti consiglio di leggere prima una guida introduttiva come quella disponibile su  git-guide.

Adesso ti mostreremo i comandi più sottovalutati dai developers, una loro padronanza ti renderà un master di GIT!

Git Rebase

Il comando git rebase è una delle funzionalità più potenti e, a volte, temute di Git. La funzione principale di rebase è quella di spostare o combinare una serie di commit su una base di codice diversa, che può essere un altro branch nel tuo repository. Ciò permette di creare una storia più lineare e pulita.

Alcune funzioni principali di git rebase:

  1. Aggiornamento del branch: se stai lavorando su un branch e il branch principale (master o main) è stato aggiornato, puoi usare rebase per spostare i tuoi cambiamenti in modo che appaiano come se fossero stati sviluppati sulla versione più recente del branch principale. Questo aiuta a ridurre i conflitti quando si fonde il branch di feature nel branch principale.
  2. Riscrivere la storia: git rebase può essere usato per modificare i commit precedenti, cambiarne l’ordine, squassarli o dividerli. Questo può aiutare a mantenere la cronologia del repository pulita e organizzata.
  3. Sviluppo collaborativo: rebase è utile per mantenere una cronologia pulita quando più persone lavorano su un progetto. Spesso viene utilizzato prima di unire le modifiche per assicurarsi che le modifiche siano basate sull’ultima versione del branch principale.
Git Rebase

Immagine tratta da www.tecadmin.net

Esempio di Git Rebase

Supponiamo che tu stia lavorando su un branch chiamato feature che è partito dal branch master alcuni commit fa. Se nel frattempo il master ha avuto nuovi commit, potresti voler aggiornare il tuo branch feature con questi cambiamenti:

git checkout feature
git rebase master

Questo sposta l’intero branch feature in modo che inizi dal punto corrente in master, applicando le modifiche del feature sopra di esso. Questo rende più facile un futuro merge con master.

Git Reset

Il comando git reset è uno strumento fondamentale in Git che ti permette di annullare le modifiche al tuo repository in vari modi, a seconda delle opzioni utilizzate. Ecco una panoramica delle sue funzioni principali:

  1. Annullare le modifiche nel tuo working directory e nell’index: puoi usare git reset per deselezionare modifiche che hai aggiunto all’index (o staging area) e opzionalmente modificare i file nel tuo working directory per riportarli allo stato di un precedente commit.
  2. Modificare la testa del branch corrente: git reset può essere usato per spostare il puntatore HEAD e il puntatore del branch corrente a un commit specifico, effettivamente annullando i commit che vengono dopo di esso nella cronologia.

Immagine tratta da www.community.aws

Git Reset –hard

Questo comando riporta il tuo indice (staging area), l’area di lavoro e HEAD allo stato di un commit specifico. Gli eventuali cambiamenti ai file nel working directory verranno persi.

git reset –hard <commit-hash>

Git Reset –soft

Al contrario di –hard, reset –soft non altera l’indice o l’area di lavoro, ma sposta solo HEAD al commit specificato. Le modifiche rimarranno nell’area di staging:

git reset –soft <commit-hash>

Git Stash

Il comando git stash è utilizzato in Git per mettere da parte temporaneamente le modifiche nel tuo working directory e nell’index (staging area), permettendoti di ottenere un repository pulito per lavorare su altri task. È molto utile per salvare il tuo lavoro in corso senza dover effettuare un commit. git stash salva temporaneamente le modifiche che non vuoi committare subito. Puoi poi lavorare su un altro branch e tornare indietro per ripristinare le modifiche con git stash pop.

Git Stash

Immagine tratta da www.medium.com

Esempio di Git Stash

Supponi di dover interrompere il lavoro corrente per correggere un bug:

git stash
git checkout bugfix-branch
# Fai le correzioni
git checkout original-branch
git stash pop

Git Cherry-Pick

Il comando git cherry-pick è utilizzato in Git per applicare le modifiche introdotte da commit esistenti in un altro branch alla testa del branch corrente. 

git cherry-pick permette di selezionare un singolo commit da un altro branch e di applicarlo al branch corrente. Questo può essere particolarmente utile in grandi team di sviluppo, dove potresti voler includere una specifica funzionalità o correzione senza integrare l’intero contenuto di un altro branch.

Git Cherry Pick

Immagine tratta da www.geeksforgeeks.org

Esempio di Git Cherry-Pick

Se vuoi applicare un commit da un branch all’altro, puoi usare:

git checkout target-branch
git cherry-pick <commit-hash>

Git Reflog

Il comando git reflog è uno strumento molto utile in Git che registra tutte le modifiche recenti ai punti di riferimento, come HEAD, i branch e altre referenze. Serve principalmente come registro di sicurezza e come mezzo per tracciare le modifiche all’interno del repository, consentendo di vedere una storia delle tue azioni in Git, inclusi i cambiamenti che non sono più raggiungibili attraverso la cronologia standard dei commit.

È estremamente utile per recuperare commit che sono stati persi a causa di un rebase o un reset.

Git Reflog

Immagine tratta da www.medium.com

Esempio di Git Reflog

Per trovare un commit perduto e ripristinarlo:

git reflog
git checkout -b recovery-branch <lost-commit-hash>

Git Bisect

Il comando git bisect è un potente strumento di debug offerto da Git, che aiuta a trovare il commit specifico che ha introdotto un bug nel codice. Utilizza un algoritmo di ricerca binaria per ridurre rapidamente lo spazio di ricerca e identificare il commit problematico.

Ecco come funziona e come si usa git bisect:

Funzionamento di Git Bisect

  1. Inizia il bisect: imposti Git in modalità bisect per iniziare la ricerca binaria tra i commit.
  2. Segnala i commit: man mano che Git ti propone commit su cui testare il software, devi marcarli come buoni o cattivi a seconda se il bug è presente o assente.
  3. Identifica il commit: continuando a segnare i commit, Git raffina la ricerca e infine identifica il primo commit in cui appare il bug.
Git Bisect

Immagine tratta da www.linkedin.com

Esempio di Git Bisect

git bisect start
git bisect bad                 # Marca l’ultimo commit con il bug
git bisect good commit-hash    # Segnala un commit funzionante
# Git ti guiderà al commit problematico
git bisect reset     # Termina bisect

Git Clean

Il comando git clean è utilizzato per rimuovere i file non tracciati dall’area di lavoro del repository Git. Questo comando è particolarmente utile per ripulire il working directory da file di compilazione, log, o altri file temporanei che non sono stati aggiunti all’index (staging area) e che non vuoi includere nel tuo repository.

Esempio di Git Clean

Per rimuovere file non tracciati:

git clean -n  # Mostra quali file saranno rimossi
git clean -f  # Rimuove i file

Conclusione

Sfruttare appieno le funzionalità di Git può migliorare significativamente l’efficacia del controllo di versione e la collaborazione in qualsiasi progetto software. I comandi avanzati di Git offrono soluzioni potenti per gestire la cronologia dei progetti, risolvere i conflitti, recuperare dati perduti e ottimizzare il flusso di lavoro di sviluppo. Con questa guida, spero di aver illuminato alcuni degli aspetti più complessi e utili di Git che ogni sviluppatore dovrebbe conoscere.