web-dev-qa-db-fra.com

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

Venant de svn, commence tout juste à se familiariser avec git.

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

Dans svn, vous pouvez facilement récupérer une branche en annulant l'opération de suppression (fusion inverse). Comme toutes les suppressions dans svn, la branche n'est jamais supprimée, elle est simplement supprimée de l'arborescence actuelle.

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

177
Ken Liu

Les branches ne sont que des indicateurs de commits en git. Dans git chaque commit a un arbre source complet, il s’agit d’une structure très différente de celle de svn où toutes les branches et les balises (par convention) résident dans des "dossiers" distincts du référentiel, à côté du "tronc" spécial.

Si la branche a été fusionnée dans une autre branche avant d'être supprimée, tous les commits seront toujours accessibles à partir de 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 point où la branche provenant d'une validation toujours accessible) ne seront plus 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 éventuellement nettoyés.

231
CB Bailey

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 ne supprime que les références aux commits, ce qui peut rendre certains commits du DAG inaccessibles, et donc invisibles. Mais tous les commits qui se trouvaient sur une branche supprimée seraient toujours dans le référentiel, du moins jusqu'à ce que les commits inaccessibles soient supprimés (par exemple, en utilisant git gc).

Notez que git branch -d refuserait de supprimer une branche s’il ne peut pas être sûr que sa suppression ne laissera pas de commits inaccessibles. Vous devez utiliser le plus fort git branch -D pour forcer la suppression d’une branche si elle laisse des commits inaccessibles.

Notez également que les validations inaccessibles, si elles sont présentes, ne sont que les validations comprises entre le dernier conseil d'une branche supprimée et une validation qui a été fusionnée avec une autre branche existante, une validation validée ou le point de branchement; selon ce qui est plus tard. Par exemple dans la situation suivante:

 ---- O ---- * ---- * ----/M ---- * <- maître <- HEAD 
\/
\-. ---- .--/- x --- y <- branche supprimée 

seuls les 'x' et 'y' deviendraient inaccessibles après la suppression de la branche.

Si vous avez exploité une branche supprimée dans le gc.reflogExpire période, 90 jours par défaut, le dernier conseil d’une branche supprimée serait enregistré dans HEAD reflog (voir git reflog show HEAD, ou git log --oneline --walk-reflogs HEAD). Vous devriez pouvoir utiliser HEAD reflog pour récupérer le pointeur supprimé. Notez également que dans ce cas, les validations inaccessibles dans juste une branche supprimée seraient protégées de l'élagage (suppression) dans la gc.reflogExpireUnreachable période, qui est par défaut de 30 jours.

Si vous ne trouvez pas la pointe d’une branche qui vient d’être effacée dans Reflog pour HEAD, vous pouvez essayer d’utiliser git fsck pour trouver "commit inaccessible <sha1>" et examinez-les (via git show <sha1> ou git log <sha1>) pour trouver la pointe de la branche supprimée.

Indépendamment de la manière dont vous trouvez le bout d’une branche supprimée, vous pouvez annuler la suppression ou plutôt recréer une branche simplement supprimée à l’aide de

git branch <deleted-branch> <found-sha1-id>

Notez cependant que le reflog d'une branche serait perdu.


Il y a aussi le script git-resurrect.sh dans contrib/ qui permet de retrouver les traces d’une branche ayant un nom donné et de la ressusciter (restaurer).

80
Jakub Narębski

Si vous craignez des branches supprimées accidentellement et que vous n'avez plus de copie locale de votre référentiel, il existe des extensions de serveurs d'entreprise Git telles que Gerrit qui détecteront les réécritures de l'historique et les suppressions de branches, les sauvegarderont sous une référence spéciale afin qu'elles soient correctement sauvegardées. peut être restauré si nécessaire et ne sera pas élagué par le ramassage des ordures. Les administrateurs de Gerrit peuvent toujours supprimer les commits sélectionnés si nécessaire pour des raisons juridiques.

2
Johanned Nicolai