In Git, i rami sono solo puntatori (riferimenti) a commit in un grafico aciclico diretto (DAG) di commit. Ciò significa che l'eliminazione di un ramo rimuove solo i riferimenti ai commit, il che potrebbe rendere irraggiungibili alcuni commit nel DAG, quindi invisibili. Ma tutti i commit che si trovavano su un ramo eliminato rimarrebbero comunque nel repository, almeno fino a quando i commit non raggiungibili verranno eliminati (ad es. Utilizzando git gc
).
Si noti che git branch -d
si rifiuta di eliminare una succursale se non si è certi che la sua eliminazione non lascerebbe commit irraggiungibili. È necessario utilizzare il più forte git branch -D
per forzare l'eliminazione di un ramo se potrebbe lasciare commit irraggiungibili.
Si noti inoltre che i commit non raggiungibili, se presenti, sono solo quei commit tra l'ultimo suggerimento di un ramo eliminato e un commit che è stato unito a un altro ramo esistente, qualsiasi commit con tag o punto di branching; qualunque sia dopo. Ad esempio nella seguente situazione:
---- O ---- * ---- * ---- / M ---- * <- master <- HEAD
\ /
\ --. ---- .-- / - x --- y <- ramo eliminato
solo i commit 'x' e 'y' diventerebbero irraggiungibili dopo aver cancellato il ramo.
Se hai operato su un ramo eliminato entro il gc.reflogExpire
periodo, 90 giorni predefiniti, avresti l'ultimo suggerimento di un ramo eliminato registrato nel registro HEAD (vedi git reflog show HEAD
, o git log --oneline --walk-reflogs HEAD
). Dovresti essere in grado di utilizzare HEAD reflog per recuperare il puntatore eliminato. Si noti inoltre che in questo caso, i commit non raggiungibili in un solo ramo eliminato sarebbero protetti dalla potatura (rimozione) entro il gc.reflogExpireUnreachable
periodo, che per impostazione predefinita è di 30 giorni.
Se non riesci a trovare la punta di un ramo appena cancellato nel reflog di HEAD, puoi provare a utilizzare git fsck
per trovare "commit non raggiungibile <sha1>" ed esaminare quelli (tramite git show <sha1>
o git log <sha1>
) per trovare la punta del ramo eliminato.
Indipendentemente da come trovi la punta di un ramo eliminato, puoi annullare la cancellazione o piuttosto ricreare un ramo appena eliminato usando
git branch <deleted-branch> <found-sha1-id>
Si noti tuttavia che il reflog per un ramo andrebbe perso.
Esiste anche lo script git-resurrect.sh in contrib/
cui aiuta a trovare tracce di una diramazione con un determinato nome e resuscitarlo (ripristinarlo).