Tag: git, rebase, reflog, bisect, cherry-pick, merge, vcs
Livello: avanzato
TL;DR: Strategie per manipolare la cronologia di commit, recuperare commit orfani, isolare regressioni e gestire branch complessi senza perdita di codice.
Git registra stati dell'albero di lavoro tramite DAG (Directed Acyclic Graph) di commit immutabili.
Un branch e' un puntatore mobile a uno specifico commit SHA.
HEAD identifica il puntatore corrente al commit o branch attivo.
Rebase riscrive la cronologia riapplicando commit su una base aggiornata.
Merge mantiene la topologia originale creando un merge commit a due o piu' genitori.
Interactive rebase consente squash, reword, drop e split di commit locali prima del push.
Git reflog traccia tutti gli spostamenti locali di HEAD, permettendo il ripristino di puntatori persi.
Git bisect esegue ricerca binaria tra due commit per identificare l'introduzione di un bug.
Git worktree consente di lavorare su branch diversi simultaneamente in cartelle separate.
Fast-forward sposta il puntatore del branch target in avanti senza creare nuovi commit.
Q: Quando usi rebase invece di merge?R: Uso rebase su branch di feature locali per mantenere una cronologia lineare prima della review; uso merge per preservare il contesto storico di integrazione sui branch condivisi.
Q: Come recuperi un commit cancellato per errore tramite reset --hard?R: Ispeziono git reflog per recuperare lo SHA antecedente al reset e ripristino il puntatore con git reset --hard <SHA> o creo un branch dedicato da quello SHA.
Q: Come risolvi conflitti ripetuti su branch a lunga durata?R: Attivo git rerere per abilitare la registrazione e il riutilizzo automatico delle risoluzioni dei conflitti precedenti.
Eseguire rebase di branch condivisi o pubblici causa disallineamento della cronologia per l'intero team.
git push --force sovrascrive il remote incondizionatamente; va sempre preferito git push --force-with-lease.
git reset --hard su file non tracciati o modifiche non committate comporta perdita definitiva dei dati non salvati.
Confondere git revert (crea un nuovo commit inverso) con git reset (sposta all'indietro il puntatore del branch).
Eseguire git checkout o git switch con modifiche in conflitto prima di aver stैशato o committato lo stato corrente.
# Riscrivere interattivamente gli ultimi 5 commit
git rebase -i HEAD~5
# Recuperare lo storico delle modifiche al puntatore HEAD
git reflog
# Push sicuro controllando lo stato del remote
git push origin <branch> --force-with-lease
# Annullare un commit specifico in cronologia condivisa
git revert <commit-sha>
# Isolare un bug con ricerca binaria automatica o manuale
git bisect start
git bisect bad HEAD
git bisect good <commit-sha-funzionante>
# Prelevare un singolo commit da un altro branch
git cherry-pick <commit-sha>
# Attivare la memorizzazione automatica della risoluzione conflitti
git config --global rerere.enabled true
# Creare un worktree separato per un fix rapido
git worktree add ../hotfix-worktree <branch-hotfix>
git worktree remove ../hotfix-worktree
[ ] Meccaniche interne del DAG: commit, tree, blob e tag
[ ] Utilizzo di git bisect run <script> per automatizzare test di regressione
[ ] Differenza tra merge --ff, --no-ff e --squash
[x] Risoluzione conflitti interattiva su rebase
[x] Ripristino di branch eliminati tramite reflog