web-dev-qa-db-fra.com

Quelle est la différence entre Git Reflog et Log?

La page de manuel indique que le journal affiche les journaux de validation et que le gestionnaire de journalisation gère les informations de réécriture. En quoi consistent exactement les informations de reflog et que contient le journal? Le journal semble beaucoup plus détaillé.

120
Noich

git log indique le HEAD actuel et son ascendance. En d'autres termes, il affiche les points de validation HEAD, puis son parent, son parent, etc. Il revient dans les origines du référentiel, en recherchant récursivement chaque parent du commit.

(Dans la pratique, certains commits ont plusieurs parents. Pour afficher un journal plus représentatif, utilisez une commande telle que git log --oneline --graph --decorate.)

git reflog ne traverse pas du tout les ancêtres de HEAD. Le refog est une liste ordonnée des commits sur lesquels HEAD a pointé: c'est l'historique d'annulation de votre repo. Le reflog ne fait pas partie du repo lui-même (il est stocké séparément dans les commits eux-mêmes) et n'est pas inclus dans les poussées, les extractions ou les clones; c'est purement local.

A part: comprendre le reflog signifie que vous ne pouvez pas vraiment perdre des données de votre repo une fois qu'elles ont été validées Si vous réinitialisez accidentellement un commit plus ancien ou si vous redéfinissez incorrectement votre base ou si vous effectuez une autre opération visuellement "supprime", vous pouvez utiliser le reflog pour voir où vous étiez auparavant et git reset --hard revenir à cette référence pour restaurer votre état précédent. Rappelez-vous que les références impliquent non seulement le commit, mais toute l'histoire derrière celle-ci.

171
ben_h
  • git log affiche le journal de validation accessible depuis les références (têtes, balises, télécommandes).
  • git reflog est un record de tous les commits qui sont ou ont été référencés dans votre repo à tout moment.

C'est pourquoi git reflog (un enregistrement local élagué après 90 jours par défaut) est utilisé lorsque vous effectuez une opération "destructive" (comme supprimer une branche), afin de récupérer le SHA1 référencé par celui-ci. branche.
Voir git config :

gc.reflogexpire
gc.<pattern>.reflogexpire

git reflog expire supprime les entrées de reflogage antérieures à cette heure; par défaut à 90 jours.
Avec "<pattern>" (par exemple, "refs/stash") au milieu, le paramètre s'applique uniquement aux références correspondant au <pattern>.

safety net

git reflog est souvent référencé comme " votre filet de sécurité } _"

En cas de problème, le conseil général, lorsque git log ne vous indique pas ce que vous recherchez, est le suivant:

" Restez calme et utilisez git reflog "

keep calm

Encore une fois, reflog est un enregistrement local de votre SHA1.
Contrairement à git log: si vous placez votre référentiel dans un référentiel amont , vous verrez le même git log, mais pas nécessairement le même git reflog.

45
VonC

Voici l'explication de reflog du livre Pro Git :

Une des choses que Git fait en arrière-plan pendant que vous travaillez est de garder un journal de bord - un journal où se trouvent vos HEAD et vos références de branche depuis quelques mois.

Vous pouvez voir votre refog en utilisant git reflog:

$ git reflog
734713b... HEAD@{0}: commit: fixed refs handling, added gc auto, updated
d921970... HEAD@{1}: merge phedders/rdocs: Merge made by recursive.
1c002dd... HEAD@{2}: commit: added some blame and merge stuff
1c36188... HEAD@{3}: rebase -i (squash): updating HEAD
95df984... HEAD@{4}: commit: # This is a combination of two commits.
1c36188... HEAD@{5}: rebase -i (squash): updating HEAD
7e05da5... HEAD@{6}: rebase -i (pick): updating HEAD

Chaque fois que le conseil de votre branche est mis à jour pour une raison quelconque, Git stocke ces informations pour vous dans cet historique temporaire. Et vous pouvez également spécifier des commits plus anciens avec ces données.

La commande reflog peut également être utilisée pour supprimer des entrées ou expirer des entrées du journal de génération qui sont trop anciennes. Dans la documentation officielle du noyau Linux Git pour reflog :

La sous-commande expire permet d'élaguer les anciennes entrées de reflog.

Pour supprimer des entrées uniques du reflet, utilisez la sous-commande delete et spécifiez l'entrée exacte (par exemple git reflog delete master@{2}).

12
user456814

J'étais curieux à propos de cela aussi et je voulais juste élaborer et résumer un peu:

  1. git log affiche un historique de tous vos commits pour la branche sur laquelle vous vous trouvez. Passez à une branche différente et vous verrez un historique de validation différent. Si vous voulez voir l'historique de validation de toutes les branches, tapez git log --all.

  2. git reflog montre un enregistrement de vos références, comme dit Cupcake. Il y a une entrée à chaque fois qu'un commit ou un checkout est fait. Essayez de basculer plusieurs fois entre deux branches à l’aide de git checkout et exécutez git reflog après chaque achat. Vous verrez l'entrée la plus récente mise à jour à chaque fois en tant qu'entrée "de paiement". Vous ne voyez pas ces types d'entrées dans git log.

Références: http://www.lornajane.net/posts/2014/git-log-all-branches

4
mitch

En fait, reflog est un alias pour

 git log -g --abbrev-commit --pretty=oneline

la réponse devrait donc être: c'est un cas spécifique.

0
user10028634