Obtenez une liste de tous les commits git, y compris ceux «perdus»

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

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

Si je git log --all --oneline , je vais recevoir les six commits.

Mais si le graphique est

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

Je ne verrai pas E et F. Puis-je obtenir git pour me dire tous les commits, y compris ceux sur les twigs qui ne sont pas nommés?

Merci

Pas particulièrement facile – si vous avez perdu le pointeur sur le bout d’une twig, c’est un peu comme si vous aviez trouvé une aiguille dans une botte de foin. Vous pouvez trouver tous les commits qui ne semblent pas être référencés plus de git fsck --unreachable fera ceci pour vous – mais cela inclura les commits que vous avez jetés après un git commit --amend , vieux commits sur les twigs qui vous avez rebasé etc etc Donc, 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 depuis environ 60 jours. Plus important encore, ils donneront un contexte sur ce que sont ces commits.

Lorsque j’aborde ce problème, j’utilise la commande suivante:

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

Cela me permet de visualiser les commits récents devenus sans tête.

Je l’ai emballé dans une aide de script appelée ~/bin/git-reflog-gitk .

Essayer:

 git log --reflog 

qui liste tous les commits de git en prétendant que tous les objects mentionnés par les reflogs ( git reflog ) sont listés sur la ligne de commande sous la forme .

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

J’ai eu la chance de récupérer le commit en regardant le reflog, qui se trouvait à .git/logs/HEAD

J’ai ensuite dû descendre jusqu’à la fin du fichier et j’ai trouvé le commit que je venais de perdre.

Comment je résous ce problème? Utilisez git fsck et connectez-vous!

Créez d’abord un fichier contenant les commits et blobs perdus (inaccessibles). (REMARQUE: si vous avez fait quelque chose comme git gc alors tout cela sera validé et vous ne les trouverez pas ici!)

 $git fsck --lost-found > lost_found.commits 

Cela vous donne un fichier comme celui-ci:

Dangling commit dec2c5e72a81ef06963397a49c4b068540fc0dc3
blob ballant f8c2579e6cbfe022f08345fa7553feb08d60a975
boule bleutée 0eb3e86dc112332ceadf9bc826c49bd371acc194
blob ballant 11cbd8eba79e01f4fd7f496b1750953146a09502
pendulation comm 18733e44097d2c7a800650cea442febc5344f9b3
bleuté 1e53a5cdb3ecdde27081ec6e8b31e4070106ee05

Vous pouvez ensuite ouvrir ce fichier avec votre éditeur de texte favori pour copier les hashes commit / blog à partir de là. (* les macros * cough * vim fonctionnent très bien pour cette * toux *)

Maintenant, vous pouvez vous git log --oneline à cette validation avec quelque chose comme git log --oneline . Alternativement, gitk, tig, ou tout autre visualiseur git devrait fonctionner.

Dans votre cas, si vous trouvez le hash pour commit F, le journal vous montrera quelque chose comme ça,

 A---B---E---F 

Rapide et facile! Maintenant, vous pouvez trouver le contexte derrière tous ces commits en suspens.

PS Oui, je sais, un message tardif, mais bon, quelqu’un pourrait le trouver ici et le trouver utile. (Surtout probablement moi dans 6 mois quand je google à nouveau)

Nous allons git log parfois n’est pas bon pour obtenir tous les détails de commits, donc pour voir ceci …

Pour Mac: Entrez dans votre projet et tapez:

 $ nano .git/logs/HEAD 

pour vous voir tous commits dans cela, ou:

 $ gedit .git/logs/HEAD 

pour vous voir tous commet en cela,

alors vous pouvez éditer dans n’importe lequel de vos navigateurs préférés.

@bsimmons

 git fsck --lost-found | grep commit 

Ensuite, créez une twig pour chacun:

 $ git fsck --lost-found | grep commit Checking object directories: 100% (256/256), done. dangling commit 2806a32af04d1bbd7803fb899071fcf247a2b9b0 dangling commit 6d0e49efd0c1a4b5bea1235c6286f0b64c4c8de1 dangling commit 91ca9b2482a96b20dc31d2af4818d69606a229d4 $ git branch branch_2806a3 2806a3 $ git branch branch_6d0e49 6d0e49 $ git branch branch_91ca9b 91ca9b 

Maintenant, de nombreux outils vous montreront une visualisation graphique de ces commits perdus.

Si vous utilisez l’interface graphique de Git Extensions, vous pouvez afficher une visualisation graphique des commits pendant que vous cochez “Affichage -> Afficher les références de renvoi”. Cela montrera les commits en suspens dans l’arborescence, comme tous les autres référencés. De cette façon, il est beaucoup plus facile de trouver ce que vous recherchez.

Voir cette image pour la démonstration. Les validations C2, C3, C4 et C5 sur l’image sont suspendues mais toujours visibles.