Pas particulièrement facile - si vous avez perdu le pointeur sur la pointe 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 - le git fsck --unreachable
feront pour vous - mais qui incluront les commits que vous avez jetés après un git commit --amend
, vieux commits sur des branches que vous avez rebasées, etc. à la fois, il y a probablement beaucoup trop d'informations à parcourir.
Donc, la réponse désinvolte est de ne pas perdre 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. Plus important encore , ils donneront un contexte à ce que ces livraisons sont .
commit --amend
ourebase
et un orphelin accidentellement en travaillant avec un HEAD détaché, par exemple.git commit --amend
etc. laissant des impasses, des commits perdus. J'ai fait quelques rebasages et autres et je me suis retrouvé avec des commits inaccessibles à partir d'aucune succursale, et je me suis senti un peu sale en les laissant dans le repo. Maintenant, la pensée n'est plus aussi troublante. :)git fsck --unreachable
cela ne le fournit pas. J'ai juste essayé. La meilleure approche est l'--reflog
option pourgit log
, comme kenorb a répondu . Ce qui est particulièrement agréable à ce sujet, c'est que, combiné à--graph
, vous obtenez un contexte visuel facile à analyser, un peu comme celui illustré dans la question originale. Par exemple, essayez:git log --graph --all --oneline --reflog
Essayer:
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>
.la source
Lorsque j'aborde ce problème, j'utilise la commande suivante:
Cela me permet de visualiser les commits récents qui sont devenus sans tête.
J'ai enveloppé cela dans un assistant de script appelé
~/bin/git-reflog-gitk
.la source
when the tips of branches and other references were updated in the *local repository*
. Vous pouvez utilisergit log --reflog
si vous souhaitez faire cela pour les changements de référence non locauxCe qui m'a sauvé la vie, c'est la commande suivante:
Vous y trouverez un écran avec l'historique des validations effectuées sur git comme celui-ci:
À ce stade, il vous suffit de trouver
HEAD@{X}
celui dont vous avez besoin, de créer une branche temporaire et de vous y déplacer comme ceci:De cette façon, vous aurez une branche temporaire avec votre commit perdu sans rebaser ou casser encore plus votre dépôt git.
J'espère que cela t'aides...
la source
Comme la réponse de @Kieran, mais pour la console:
git log --oneline --all --graph --decorate $(git reflog | awk '{print $1}')
la source
git log --all
. Un exemple rapide: après ungit reset --hard @^
commit HEAD @ {0} ne sera que dans le reflog, et commegit reflog
il ne prend pas en charge,--graph
vous devez transmettre les commits àgit log --graph
pour obtenir une représentation visuelle.--reflog
place de$(git reflog | awk '{print $1}')
git log --oneline --all --graph --decorate $(git reflog | awk '{print $1}')
àgit log --oneline --all --graph --decorate --reflog
, ils sont presque identiques sauf --reflog inclus des détails tels que les entrées WIP.reflog
pourquoi ne pas l'utiliser à lalog --reflog
place?Comment résoudre ce problème? Utilisation
git fsck
et journalisation!Créez d'abord un fichier contenant des commits et des blobs perdus (inaccessibles). (REMARQUE: si vous avez fait quelque chose comme
git gc
cela, tous les commits seront récupérés et vous ne les trouverez pas ici!)Cela vous donne un fichier comme celui-ci:
Vous pouvez ensuite ouvrir ce fichier avec votre éditeur de texte préféré pour copier les hachages de commit / blog à partir de là. (Les macros * toux * vim fonctionnent très bien pour cette * toux *)
Vous pouvez maintenant vous reconnecter à partir 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 ça,
Rapide et facile! Vous pouvez maintenant trouver le contexte derrière tous ces commits pendants.
PS Oui, je sais, post tardif, mais bon, quelqu'un pourrait le trouver ici et le trouver utile. (Probablement moi dans 6 mois quand je google à nouveau)
la source
J'ai eu de la chance de récupérer le commit en regardant le reflog, qui se trouvait à
.git/logs/HEAD
J'ai ensuite dû parcourir jusqu'à la fin du fichier et j'ai trouvé le commit que je venais de perdre.
la source
Il
git log
n'est parfois pas bon d'obtenir tous les détails des commits, alors pour voir ceci ...Pour Mac: entrez dans votre projet git et tapez:
pour afficher tous les commits dans ce domaine, ou:
pour vous voir tous les engagements dans ce domaine,
alors vous pouvez éditer dans n'importe lequel de vos navigateurs préférés.
la source
@bsimmons
Créez ensuite une branche pour chacun:
Maintenant, de nombreux outils vous montreront une visualisation graphique de ces commits perdus.
la source
Si vous utilisez l'interface graphique Git Extensions, elle peut vous montrer une visualisation graphique des commits en suspens si vous cochez "Afficher -> Afficher les références de reflog". 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 une démonstration. Les validations C2, C3, C4 et C5 sur l'image sont pendantes mais toujours visibles.
la source
m'a sauvé! J'ai perdu mon tout en fusionnant HEAD et je n'ai pas pu trouver mon dernier commit! Ne s'affiche pas dans l'arborescence des sources mais
git log --reflog
affiche tous mes commits locaux avantla source