213 votes

Obtenir une liste de tous les commits git, y compris ceux qui sont "perdus".

Disons que j'ai un graphique comme celui-ci :

A---B---C---D (master)
     \
      \-E---F (HEAD)

Si je le fais git log --all --oneline je vais avoir mes six engagements.

Mais si le graphique est

A---B---C---D (master, HEAD)
     \
      \-E---F

Je ne verrai pas E et F. Puis-je obtenir de git qu'il m'indique tous les commits, y compris ceux des branches qui ne sont pas nommées ?

Gracias

204voto

kenorb Points 2464

Essayez :

git log --reflog

qui liste tous les commits git en prétendant que tous les objets mentionnés par les reflogs ( git reflog ) sont listés sur la ligne de commande comme <commit> .

70voto

araqnid Points 33350

Pas particulièrement facile - si vous avez perdu le pointeur vers l'extrémité d'une branche, c'est un peu comme trouver une aiguille dans une botte de foin. Vous pouvez trouver tous les commits qui ne semblent plus être référencés- git fsck --unreachable le fera pour vous - mais cela inclura les commits que vous avez jetés après un git commit --amend les anciens commits sur les branches que vous avez rebasées etc etc. Ainsi, voir tous ces commits à la fois est très probablement beaucoup trop d'informations à parcourir.

Donc la réponse désinvolte est : ne perdez pas de vue les choses qui vous intéressent. Plus sérieusement, les reflogs contiendront par défaut des références à tous les commits que vous avez utilisés au cours des 60 derniers jours environ. Plus important encore, ils donneront un certain contexte sur ce que ces commits son .

63voto

Kieran Points 21

Lorsque je m'attaque à ce problème, j'utilise la commande suivante :

git reflog |  awk '{ print $1 }' | xargs gitk

Cela me permet de visualiser les commits récents qui sont devenus headless.

J'ai mis cela dans une aide script appelée ~/bin/git-reflog-gitk .

Edit : - mon wrapper git-reflog-gitk est redondant - puisque vous pouvez maintenant appeler gitk --reflog directement

60voto

Sonhja Points 1668

Ce qui m'a sauvé la vie, c'est la commande suivante :

git reflog

Vous y trouverez un écran avec l'historique des commits effectués dans git comme celui-ci :

enter image description here

A ce stade, il ne vous reste plus qu'à trouver la HEAD@{X} dont vous avez besoin, créez une branche temporaire et déplacez-vous vers elle comme ceci :

git checkout -b temp_branch HEAD@{X}

De cette façon, vous aurez une branche temporaire avec votre commit perdu sans avoir à rebaser ou casser encore plus votre dépôt git.

J'espère que cela vous aidera...

29voto

Florian Fida Points 402

Comme la réponse de @Kieran, mais pour la console : git log --oneline --all --graph --decorate $(git reflog | awk '{print $1}')

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