178 votes

Inscription et la suppression de Git commits qui sont sous aucune branche (bancales?)

J'ai un dépôt git avec beaucoup de commits qui sont dans aucune branche particulière, j'ai peut - git show , mais lorsque j'essaie de la liste des branches qui les contiennent, il rend compte de rien:

J'ai pensé que c'est le pendre s'engage/arbre à problème (comme un résultat de-D de la branche), donc j'ai taillé les pensions de titres, mais je vois encore le cas après que:

$ git fetch origin

$ git fsck --unreachable
$ git fsck

Pas de sortie, rien qui pendouille (à droite?)

$ git show 793db7f272ba4bbdd1e32f14410a52a412667042
commit 793db7f272ba4bbdd1e32f14410a52a412667042
Author: ..

Mais

$ git branch --contains 793db7f272ba4bbdd1e32f14410a52a412667042

Donne pas de sortie

Quel est exactement l'état de s'engager? Comment puis-je liste tous les commits avec le même état, Comment puis-je supprimer s'engage comme ceux-là?

312voto

tarsius Points 1427

Pour supprimer tous pendre s'engage et ceux accessibles à partir de la reflogs ce faire:

git reflog expire --expire-unreachable=now --all
git gc --prune=now

Mais soyez certains que c'est ce que vous voulez. Je vous recommande de lire les pages de manuel, mais voici l'essentiel:

git gcsupprime inaccessible objets (les livraisons, les arbres, les blobs (fichiers)). Un objet est inaccessible si ce n'est pas une partie de l'histoire de l'une des branches. En fait c'est un peu plus compliqué:

git gc fait quelques autres choses, mais ils ne sont pas pertinentes ici et pas dangereux.

Inaccessible objets qui sont âgés de moins de deux semaines ne sont pas supprimés, de sorte que nous utilisons --prune=now ce qui signifie "enlever inaccessible objets qui ont été créés avant maintenant".

Les objets peuvent aussi être atteints à travers le reflog. Tandis que les branches d'enregistrer l'historique d'un projet, reflogs record de l'histoire de ces branches. Si vous modifier, reset etc. les commits sont retirés de l'histoire de la branche, mais git maintient autour au cas où vous vous rendez compte que vous avez fait une erreur. Reflogs sont un moyen pratique pour trouver ce que destructrice (et d'autres) les opérations ont été effectuées sur une branche (ou la TÊTE), ce qui rend plus facile pour annuler une opération destructrice.

Nous aussi nous devons supprimer la reflogs pour supprimer réellement tout n'est pas accessible à partir d'une branche. Nous le faisons en expirant --all reflogs. Git tient un peu de la reflogs pour protéger les utilisateurs, donc nous avons à nouveau pour lui dire de ne pas le faire: --expire-unreachable=now.

Depuis, j'utilise principalement le reflog pour récupérer les destructeurs des opérations que j'utilise habituellement --expire=now au lieu de cela, ce qui zappe les reflogs complètement.

82voto

Aristotle Pagaltzis Points 43253

Pas de sortie, rien qui pendouille (à droite?)

Notez que s'engage visé de votre reflog sont considéré joignable.

Quel est exactement l'état de s'engager? Comment puis-je liste tous les commits avec le même état

Pass --no-reflogs de convaincre git fsck pour vous les montrer.

Comment puis-je supprimer s'engage comme ceux-là?

Une fois votre reflog entrées sont expirés, ces objets seront ensuite nettoyés par git gc.

L'expiration est réglementé par l' gc.pruneexpire, gc.reflogexpire, et gc.reflogexpireunreachable paramètres. Cf. git help config.

Les valeurs par défaut sont tout à fait raisonnables.

14voto

sehe Points 123151
git branch --contains 793db7f272ba4bbdd1e32f14410a52a412667042

probablement juste besoin d'être

git branch -a --contains 793db7f272ba4bbdd1e32f14410a52a412667042

faire rapport sur les branches de télécommandes

2voto

dublev Points 734

git gc --prune=<date> valeurs par défaut pour tailler les objets de plus de deux semaines. Vous pouvez définir une date plus récente. Mais, commandes git que de créer des objets en vrac sont généralement exécuter git gc --auto (qui pruneaux d'objets en vrac, si leur nombre est supérieur à la valeur de la variable de configuration gc.auto).

Êtes-vous sûr de vouloir supprimer ces commet? gc.auto réglage par défaut est de s'assurer que les objets lâches ne pas prendre trop de mémoire et de stockage des objets en vrac pour un certain laps de temps est généralement une bonne idée. De cette façon, si vous vous rendez compte que demain supprimés de votre branche contenait une livraison dont vous avez besoin, vous pouvez le récupérer.

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