Che cos’è un dangling commit? Quel commit che potresti avere perso per sempre. In questo articolo ti spiego cosa sono e come recuperarli.
Ti è mai capitato nella vita di perdere un commit all’interno di un branch del tuo repository gestito in git?
Ecco, purtroppo delle volte può succedere: git non è perfetto, può capitare anche a lui di farti fare casino.
Eppure, possiamo recuperare questi commit persi nel baratro: come?
Diciamo attraverso una serie di errori che io stesso ho fatto diverse volte e ne ho scritto tanti articoli a riguardo.
Mi presento: mi chiamo Lorenzo Neri e sono un informatico. Mi occupo di realizzare tutti quei contenuti che permettono a persone come te di padroneggiare l’arte del nuovo millennio, l’informatica!
Dicevo prima che ci sono stati tanti errori che ho fatto nella mia vita, ma a un certo punto ho deciso di farne una serie di articoli per aiutare persone come te a trovare una soluzione, che sono riuscito a creare o trovare proprio grazie ai miei stessi errori.
Ciò detto, cerchiamo di capire che cos’è un dangling commit e come si possa recuperare.
Perché si formano?
Prima ancora di capire cosa sono, che è la parte più semplice, è giusto chiarire del tutto perché i dangling commit si formano.
Quando ti metti all’opera all’interno del tuo repository, potresti per errore, disattenzione, o altro, interrompere il processo di alcune operazioni dando vita a dei blob intermediari.
Questi blob intermediari li possiamo definire come un tentativo di non perdere informazioni da parte di git: detta in modo un po’ volgare e meno tecnichese come se fosse un tentativo di sanare un aborto spontaneo.
E quindi?
E quindi ecco che cos’è un dangling commit
Si tratta sostanzialmente di un insieme di informazioni che non sono referenziate da nessun branch o stash.

Di fatto, piccola digressione, in questo articolo parlo proprio di come recuperare un dropped stash: può tornarti utile.
Torniamo a noi.
All’interno di git c’è un garbage collector che ci permette non solo di vedere i dangling commit ma anche di capire che cosa c’è al loro interno.
Se lanci il comando:
git fsck --no-reflog
Otterrai tutti quei dangling commit e blob non referenziati da nessun branch o stash appunto:
Checking object directories: 100% (256/256), done.
dangling commit 0dd4695b07f6f612cf57081c8c164416a9a8fb57
dangling commit 979a8e64dc247b9876c68d06db61ff96f2cdd303
dangling blob bf9c2f9c4383d089f0aedc5ca6fb0f2a3df015fb
dangling commit 5da6f8cdf57995dc9fd7ef22822a1a40844c5b17
dangling blob ece2bc1a3eade5e2ece37e16b6ef25d5095d6e3d
dangling commit 7ac9e14193de44c1466a5762128482173e7b1d90
Una volta capito che cos’è un dangling commit e come si forma, vediamo anche il suo contenuto.
Per esempio:
git show 0dd4695b07f6f612cf57081c8c164416a9a8fb57
Mi mostrerà le varie informazioni del commit con l’hash selezionato:
commit 0dd4695b07f6f612cf57081c8c164416a9a8fb57
Author: Lorenzo Neri (Istorn)
Date: Fri May 21 11:44:17 2021 +0200
file feature
diff --git a/feature.txt b/feature.txt
new file mode 100644
index 0000000..e69de29