Venant de svn, je commence tout juste à se 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 annulant l'opération de suppression (fusion inverse). Comme toutes les suppressions dans svn, la branche n'est jamais vraiment supprimée, elle est simplement supprimée de l'arborescence actuelle.
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-ils conservés?
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 fortgit 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:
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 (voirgit reflog show HEAD
, ougit 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 legc.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 (viagit show <sha1>
ougit 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
Notez cependant que le reflog d'une branche serait perdu.
Il existe également un script git-resurrect.sh
contrib/
qui permet de trouver des traces d'une pointe de branche avec un nom donné et de la ressusciter (annuler la suppression).la source
git reflog show HEAD
listé le commit et j'ai créé une nouvelle branche comme vous l'avez dit, parfait.Si vous vous inquiétez des branches supprimées accidentellement et que vous n'avez plus de copie locale de votre dépôt, il existe des extensions pour les serveurs Git d'entreprise comme Gerrit qui détecteront les réécritures d'historique et les suppressions de branches, les sauvegarderont sous une référence spéciale afin qu'elles peut être restauré si nécessaire et ne sera pas élagué par le ramasse-miettes. Les administrateurs Gerrit peuvent toujours supprimer les commits sélectionnés si nécessaire pour des raisons juridiques.
la source