Dans Git, les branches ne sont que des pointeurs (références) vers des commits dans un graphe acyclique dirigé (DAG) de commits. Cela signifie que la suppression d'une branche supprime uniquement les références aux commits, ce qui peut rendre certains commits dans le 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
cela refuserait de supprimer une branche s'il ne peut pas être sûr que sa suppression ne laisserait pas de commits inaccessibles. Vous devez utiliser le plus fort 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, ne sont que les commits entre le dernier bout d'une branche supprimée et soit un commit qui a été fusionné avec une autre branche existante, un commit balisé, ou le point de branchement; selon la dernière éventualité. Par exemple dans la situation suivante:
---- O ---- * ---- * ---- / M ---- * <- maître <- HEAD
\ /
\ --. ---- .-- / - x --- y <- branche supprimée
seuls les commits «x» et «y» deviendraient inaccessibles après la suppression de la branche.
Si vous avez opéré sur une succursale supprimée pendant la gc.reflogExpire
période, 90 jours par défaut, vous auriez le dernier conseil d'une succursale supprimée enregistré dans HEAD reflog (voir git reflog show HEAD
, ou git log --oneline --walk-reflogs HEAD
). Vous devriez pouvoir utiliser le reflog HEAD pour récupérer le pointeur supprimé. Notez également que dans ce cas, les commits inaccessibles dans une seule branche supprimée seraient protégés contre l'élagage (suppression) dans le gc.reflogExpireUnreachable
délai, qui par défaut est de 30 jours.
Si vous ne trouvez pas la pointe d'une branche qui vient d'être supprimée dans reflog pour HEAD, vous pouvez essayer d'utiliser git fsck
pour trouver "commit inaccessible <sha1>", et les examiner (via git show <sha1>
ou git log <sha1>
) pour trouver la pointe de la branche supprimée.
Indépendamment de la façon dont vous trouvez la pointe d'une branche supprimée, vous pouvez annuler la suppression, ou plutôt recréer une branche qui vient d'être supprimée en utilisant
git branch <deleted-branch> <found-sha1-id>
Notez cependant que le reflog d'une branche serait perdu.
Il existe également un script git-resurrect.shcontrib/
qui permet de trouver des traces d'une pointe de branche avec un nom donné et de la ressusciter (annuler la suppression).