Dans Git, les branches sont juste des pointeurs (références) vers les commits dans un graphe acyclique dirigé (DAG) de commits. Cela signifie que la suppression d'une branche ne supprime que les références aux commits, ce qui peut rendre certains commits du DAG inaccessibles, donc invisibles. Mais tous les commits qui étaient sur une branche supprimée seraient toujours dans le référentiel, au moins jusqu'à ce que les commits inaccessibles soient élagués (par exemple en utilisant git gc
).
Notez que git branch -d
refusera de supprimer une branche s'il ne peut pas être sûr que sa suppression ne laissera pas de commits inaccessibles. Vous devez utiliser la méthode plus forte git branch -D
pour forcer la suppression d'une branche si elle risque de laisser des commits inaccessibles.
Notez également que les commits inaccessibles, s'ils sont présents, sont seulement les commits entre le dernier bout d'une branche supprimée et soit un commit qui a été fusionné à une autre branche existante, soit un commit marqué, soit le point de branchement ; selon ce qui est le plus tardif. Par exemple, dans la situation suivante :
\----O----\*----\*----/M----\* <-- master <-- HEAD
\\ /
\\--.----.--/--x---y <-- deleted branch
seuls les commits 'x' et 'y' deviendraient inaccessibles après la suppression de la branche.
Si vous avez opéré sur une branche supprimée dans le gc.reflogExpire
période, par défaut 90 jours, vous auriez la dernière pointe d'une branche supprimée enregistrée dans HEAD reflog (voir git reflog show HEAD
ou git log --oneline --walk-reflogs HEAD
). Vous devriez être en mesure d'utiliser HEAD reflog pour récupérer le pointeur supprimé. Notez également que dans ce cas, les commits inaccessibles dans une branche supprimée seraient protégés de l'élagage (suppression) au sein de l'arborescence de la branche. gc.reflogExpireUnreachable
qui, par défaut, est de 30 jours.
Si vous ne trouvez pas l'extrémité d'une branche qui vient d'être supprimée dans reflog pour HEAD, vous pouvez essayer d'utiliser git fsck
pour trouver les "unreachable commit <sha1>", et examiner ceux-ci (par l'intermédiaire de git show <sha1>
o git log <sha1>
) pour trouver l'extrémité de la branche supprimée.
Indépendamment de la façon dont vous trouvez l'extrémité d'une branche supprimée, vous pouvez annuler la suppression, ou plutôt recréer une branche juste supprimée en utilisant
git branch <deleted-branch> <found-sha1-id>
Notez cependant que le reflog pour une branche serait perdu.
Il y a également git-resurrect.sh script en contrib/
qui permet de retrouver les traces d'un embranchement avec nom de famille et de le ressusciter (le supprimer).