182 votes

La suppression d'une branche dans git la supprime-t-elle de l'historique ?

Venant de svn, je commence juste à me familiariser avec git.

Quand une branche est supprimée dans git, est-elle supprimée de l'historique ?

Dans svn, vous pouvez facilement récupérer une branche en revenant sur l'opération de suppression (reverse merge). Comme toutes les suppressions dans svn, la branche n'est jamais vraiment supprimée, elle est juste retirée de l'arbre actuel.

Si la branche est effectivement supprimée de l'historique dans git, qu'advient-il des modifications qui ont été fusionnées à partir de cette branche ? Sont-elles conservées ?

241voto

Charles Bailey Points 244082

Les branches sont juste des pointeurs vers les commits dans git. Dans git, chaque commit a un arbre source complet, c'est une structure très différente de celle de svn où toutes les branches et les tags (par convention) se trouvent dans des "dossiers" séparés du dépôt à côté du "tronc" spécial.

Si la branche a été fusionnée dans une autre branche avant d'être supprimée, toutes les modifications seront encore accessibles depuis l'autre branche lorsque la première branche sera supprimée. Ils restent exactement comme ils étaient.

Si la branche est supprimée sans être fusionnée dans une autre branche, les commits de cette branche (jusqu'au moment où elle a bifurqué à partir d'un commit qui est encore accessible) cesseront d'être visibles.

Les commits seront toujours conservés dans le référentiel et il est possible de les récupérer immédiatement après la suppression, mais ils seront finalement collectés.

83voto

Jakub Narębski Points 87537

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).

2voto

Si vous vous inquiétez de la suppression accidentelle de branches et que vous ne disposez plus d'une copie locale de votre repo, il existe des extensions pour les serveurs Git d'entreprise comme Gerrit qui détectent les réécritures de l'historique et les suppressions de branches, les sauvegardent sous un ref spécial afin qu'elles puissent être restaurées si nécessaire et ne soient pas élaguées par le garbage collection. Les administrateurs de Gerrit peuvent toujours supprimer certains commits si nécessaire pour des raisons juridiques.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X