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

10voto

git log --reflog

m'a sauvé ! J'ai perdu le mien en fusionnant HEAD et je ne pouvais pas trouver mon dernier commit ! N'apparaît pas dans l'arbre des sources mais git log --reflog montrer tous mes commits locaux avant

9voto

bsimmons Points 147

Comment résoudre ce problème ? Utilisez git fsck et l'exploitation forestière !

Créez d'abord un fichier contenant les commits et blobs perdus (inaccessibles) (NOTE : si vous avez fait quelque chose comme git gc alors il va collecter tous les commits 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
goutte pendante f8c2579e6cbfe022f08345fa7553feb08d60a975
goutte de sang 0eb3e86dc112332ceadf9bc826c49bd371acc194
goutte de sang 11cbd8eba79e01f4fd7f496b1750953146a09502
dangling commit 18733e44097d2c7a800650cea442febc5344f9b3
goutte de sang 1e53a5cdb3ecdde27081ec6e8b31e4070106ee05

Vous pouvez ensuite ouvrir ce fichier avec votre éditeur de texte préféré pour copier les hashs de commit/blog à partir de là. (* toux * Les macros vim fonctionnent très bien pour cela. toux *)

Maintenant vous pouvez vous reconnecter à partir de ce commit avec quelque chose comme git log --oneline <commit hash> . Alternativement, gitk, tig, ou tout autre visualisateur git devrait fonctionner.

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

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

Rapide et facile ! Maintenant vous pouvez trouver le contexte derrière tous ces commits qui pendent.

P.S. Oui, je sais, c'est un post tardif, mais bon, quelqu'un pourrait le trouver ici et le trouver utile. (Très probablement moi dans 6 mois quand je Googlerai à nouveau ce sujet)

5voto

GameScripting Points 2922

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

Je devais ensuite descendre à la fin du fichier et j'ai trouvé l'engagement que je venais de perdre.

5voto

Vinod Joshi Points 294

Nous allons git log Parfois, il n'est pas bon d'obtenir le détail de tous les commits, alors pour voir cela...

Pour Mac : Entrez dans votre projet git et tapez :

$ nano .git/logs/HEAD

pour vous afficher tous les commits dans ce, ou :

$ gedit .git/logs/HEAD

pour vous voir tous engagés dans cette voie,

vous pourrez ensuite l'éditer dans n'importe lequel de vos navigateurs préférés.

3voto

yakoda Points 109

@bsimmons

git fsck --lost-found | grep commit

Puis créez une branche pour chacune d'elles :

$ 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

Aujourd'hui, de nombreux outils vous montrent une visualisation graphique de ces commits perdus.

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