web-dev-qa-db-fra.com

Obtenir une liste de tous les commits git, y compris les 'perdus'

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

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

Si je fais git log --all --oneline, j'aurai les six de mes commits.

Mais si le graphique est

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

Je ne verrai pas E et F. Puis-je obtenir que Git me dise tous les commits, y compris ceux des branches non nommées?

Merci

79
Amadan

Pas particulièrement facile - si vous avez perdu le pointeur sur le bout d'une branche, c'est un peu comme chercher 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és, etc. ces commits à la fois sont probablement beaucoup trop d’informations à parcourir.

Donc, la réponse désinvolte est la suivante: ne perdez pas la trace des choses qui vous intéressent. Plus sérieusement, les réflexions contiendront des références à tous les commits que vous avez utilisés depuis environ 60 jours par défaut. Plus important encore, ils donneront un peu de contexte sur ce que ces commits sont .

46
araqnid

Essayer:

git log --reflog

qui répertorie tous les commits git en prétendant que tous les objets mentionnés par reflogs (git reflog) sont répertoriés sur la ligne de commande sous la forme <commit>.

50
kenorb

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 qui sont devenus sans tête.

J'ai ceci encapsulé dans un assistant de script appelé ~/bin/git-reflog-gitk.

42
Kieran

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

19
Florian Fida

J'ai eu de la chance de récupérer le commit en regardant le refog, situé à .git/logs/HEAD

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

5
GameScripting

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

Commencez par créer un fichier contenant des commits et des blobs perdus (inaccessibles). (NOTE: si vous avez fait quelque chose comme git gc, alors toutes les commises seront collectées et vous ne les trouverez pas ici!)

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

Cela vous donne un fichier comme celui-ci:

balancer commettre dec2c5e72a81ef06963397a49c4b068540fc0dc3
boule pendante f8c2579e6cbfe022f08345fa7553feb08d60a975
boule pendante 0eb3e86dc112332ceadf9bc826c49bd371acc194
boule pendante 11cangaeba79e01f4fd7f496b1750953146a09502
balancer commettre 18733e44097d2c7a800650cea442febc5344f9b3
boule pendante 1e53a5cdb3ecdde27081ec6e8b31e4070106ee05 

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

Vous pouvez maintenant vous déconnecter de ce commit avec quelque chose comme git log --oneline <commit hash>. Alternativement, gitk, tig ou tout autre visualiseur git devrait fonctionner.

Dans votre cas, si vous trouvez le hachage pour commit F, le journal vous montrera quelque chose comme ceci, 

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

Rapide et facile! Vous pouvez maintenant trouver le contexte de tous ces commits en suspens.

P.S. Oui, je sais, post tard, mais bon, quelqu'un pourrait le trouver ici et le trouver utile. (Surtout moi dans 6 mois quand j'y reviendrai)

5
bsimmons

Nous allons git log parfois il n'est pas bon d'avoir tous les détails des commits, donc pour voir ceci ...

Pour Mac: entrez dans votre projet git et tapez:

$ nano .git/logs/HEAD

pour vous voir tous commet dedans, 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.

4
Vinod Joshi

Si vous utilisez l'interface graphique de Git Extensions, elle peut vous montrer une visualisation graphique des commits pendants si vous cochez la case "Affichage -> Afficher les références de refonte" . Cela affichera les commits pendants 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 cherchez.

Voir cette image pour démonstration. Les commits C2, C3, C4 et C5 sur l'image sont pendants mais toujours visibles.

1
Zdovc

@bsimmons

git fsck --lost-found | grep commit

Puis créez une branche 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 vont vous montrer une visualisation graphique de ces commits perdus.

1
yakoda

Ce qui m'a sauvé la vie était la commande suivante:

git reflog

Vous y trouverez un écran avec l'historique des commits faits pour git comme celui-ci:

 enter image description here 

À ce stade, il vous suffit de trouver le HEAD@{X} dont vous avez besoin, de créer une branche temporaire et de vous y déplacer comme suit:

git checkout -b temp_branch HEAD@{X}

De cette façon, vous aurez une branche temporaire avec votre commit perdu sans redistribuer ou casser encore plus votre référentiel git.

J'espère que cela t'aides...

0
Sonhja