Est-ce que supprimer une branche dans git le supprime de l'historique?

venant de svn, je commence à peine à me familiariser avec git.

Lorsqu'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 inversant l'opération de suppression (reverse merge). Comme toutes les suppressions dans svn, la branche n'est jamais vraiment supprimée, elle est simplement retirée de l'arbre actuel.

si la branche est effectivement supprimé de l'histoire dans git, ce qui se passe à la les changements qui ont été fusionnés à partir de cette branche? Sont-ils conservés?

154
demandé sur Sam 2010-04-10 19:43:14

3 réponses

Branches sont juste des pointeurs pour commettre dans git. Dans Git chaque commit a une arborescence complète des sources, c'est une structure très différente de svn où toutes les branches et les tags (par convention) vivent 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, alors toutes les propagations seront toujours accessibles depuis l'autre branche lorsque la première branche est supprimée. Ils restent exactement comme ils être.

Si la branche est supprimé sans être fusionnées dans une autre branche puis l'engage dans cette branche (jusqu'au point où la fourche d'un commit qui est toujours accessible) cesse d'être visible.

les commits seront toujours conservés dans le dépôt et il est possible de les récupérer immédiatement après la suppression, mais ils seront éventuellement ramassés.

199
répondu CB Bailey 2010-04-10 15:57:03

en Git, les branches ne sont que des pointeurs (références) pour les propagations dans un graphe acyclique dirigé (DAG) de propagations. Cela signifie que supprimer une branche ne supprime que les références aux commits, ce qui pourrait rendre certaines commits dans le DAG inaccessibles, donc invisibles. Mais toutes les propagations qui étaient sur une branche supprimée seraient toujours dans le dépôt, au moins jusqu'à ce que les propagations inaccessibles soient éliminées (par exemple en utilisant git gc ).

noter que git branch -d refuserait de supprimer un branch si elle ne peut pas être sûre que la suppression ne laisserait pas des propagations inaccessibles. Vous devez utiliser le plus fort git branch -D pour forcer la suppression d'une branche si elle pourrait laisser inaccessible s'engage.

Notez aussi que les commits inaccessibles, s'ils sont présents, ne sont que les commits entre la dernière extrémité d'une branche supprimée et soit une commit qui a été fusionnée avec une autre branche existante, toute commit marquée, soit le point de branchement, si celui-ci est postérieur. Par exemple, dans le situation suivante:

----O----*----*----/M----*    <-- master <-- HEAD
     \            /
      \--.----.--/--x---y     <-- deleted branch

n'engage que 'x' et ' y ' deviendraient inaccessibles après suppression de la branche.

si vous avez opéré sur une branche supprimée au cours de la période gc.reflogExpire , par défaut 90 jours, vous avez la dernière pointe d'une branche supprimée enregistrée dans HEAD refrog (voir git reflog show HEAD , ou git log --oneline --walk-reflogs HEAD ). Vous devriez pouvoir utiliser HEAD refrog pour récupérer le pointeur supprimé. Notons également que, dans ce cas, inaccessible s'engage dans juste un la branche supprimée serait protégée contre l'élagage (enlèvement) dans la période gc.reflogExpireUnreachable , qui est par défaut de 30 jours.

si vous ne trouvez pas la pointe d'une branche effacée dans refrog for HEAD, vous pouvez essayer d'utiliser git fsck pour trouver" unreachable commit ", et examiner ceux-ci (via git show <sha1> ou git log <sha1> ) pour trouver la pointe de la branche effacée.

indépendant sur 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 reflogement d'une branche serait perdu.


il y a aussi git-resurrect.sh script dans contrib/ qui aide à trouver des traces d'une pointe de branche avec un prénom et le ressusciter (undelete).

71
répondu Jakub Narębski 2014-05-06 11:41:49

si vous êtes inquiet au sujet des branches accidentellement supprimées et que vous n'avez plus de copie locale de votre repo, il y a des extensions aux serveurs git d'entreprise comme Gerrit qui détectera les réécritures historiques et les suppressions de branche, les sauvegardera sous une réf spéciale afin qu'ils puissent être restaurés si nécessaire et ne seront pas élagués par la collecte des ordures. Les administrateurs Gerrit peuvent toujours supprimer les propagations sélectionnées si nécessaire pour des raisons juridiques.

1
répondu Johanned Nicolai 2013-01-07 19:40:31