Aller au contenu
yaggui docsProchaine (non publiée)

Historique d’un fichier et blame

L’historique d’un fichier liste les commits qui l’ont modifié, avec le diff de chacun. Le blame montre, pour chaque ligne d’un fichier, le commit qui l’a modifiée en dernier. Les deux remplacent le graphe dans la vue du dépôt ; appuyez sur Esc ou cliquez sur Graphe pour y revenir.

Point d’entrée Point de départ
Barre d’outils du diff, icône Historique du fichier (diffs dans la vue du dépôt) HEAD
Clic droit sur un fichier dans le panneau de détail du commit ou dans le panneau des changements → Historique du fichier HEAD
Vue blame, bouton Historique du fichier Le commit qui fait l’objet du blame
Vue blame, clic droit sur une ligne → Historique du fichier HEAD
Palette (⌘K, Ctrl+K sous Windows et Linux) → Historique du fichier courant HEAD. Disponible quand un diff, un blame ou un historique de fichier est ouvert dans l’onglet actif

Quand l’historique part d’un autre commit que HEAD, son SHA court s’affiche dans l’en-tête sous forme de pastille. Sur une branche qui n’a encore aucun commit, la liste est vide.

La partie gauche liste les Commits qui ont modifié le fichier, du plus récent au plus ancien, avec leur nombre. Chaque ligne affiche :

  • la lettre du changement pour ce fichier (ajouté, modifié, supprimé), ou une icône de merge pour un commit de merge,
  • le résumé du commit et son SHA court,
  • l’auteur et la date relative,
  • depuis ancien chemin sur le commit qui a renommé le fichier.

La partie droite montre la modification que le commit sélectionné apporte à ce fichier, par rapport à son premier parent, dans le visualiseur de diff complet (disposition, options, garde-fou des gros diffs). Sa barre d’outils comporte un bouton Blame à ce commit ; pour un commit qui a supprimé le fichier, il fait le blame de la version juste avant.

Le commit le plus récent est sélectionné à l’ouverture de la vue. Pour vous déplacer :

Touche Action
↑ / ↓, Home / End Se déplacer dans la liste (quand elle a le focus)
j / k, ou les flèches Commit plus ancien / Commit plus récent de la barre d’outils du diff Commit plus ancien / plus récent
Esc Fermer l’historique, retour au graphe

La liste se charge par pages de 500 au fil du défilement (le compteur affiche 500+ tant qu’il en reste), si bien que les longs historiques s’ouvrent vite. Elle se met à jour quand des branches bougent.

yaggui suit un fichier à travers les renommages. Il lit l’historique du nom actuel et, en arrivant au commit qui a ajouté ce nom, y cherche un renommage (par similarité de contenu, sur le premier parent) et poursuit avec l’ancien nom. Le commit du renommage affiche depuis ancien chemin.

Fenêtre de terminal
git log --name-status --no-renames <rev> -- <path>
git diff-tree -r --find-renames --name-status <parent> <commit> # au commit qui a ajouté le nom

Cela diffère de git log --follow : c’est plus rapide sur les gros dépôts, cela suit les renommages mais pas les copies, et seulement le long des premiers parents. Quand aucun commit n’a modifié le chemin, la vue indique « Aucun commit n’a modifié src/app.ts. »

Point d’entrée Version examinée
Barre d’outils du diff, icône Blame (diff de la copie de travail) Le fichier sur le disque, modifications non commitées comprises
Barre d’outils du diff, icône Blame à ce commit (diff d’un commit, historique du fichier) Le fichier à ce commit
Clic droit sur un fichier dans le panneau des changements → Blame Le fichier sur le disque
Clic droit sur un fichier dans le panneau de détail du commit → Blame à ce commit Le fichier à ce commit
Palette → Blame du fichier courant La version du diff ouvert

L’en-tête affiche le chemin et une pastille indiquant la version examinée (un SHA court, ou Copie de travail). Chaque ligne de la grille comporte :

  • une barre d’âge : huit nuances, du plus ancien au plus récent commit de ce fichier. Les nuances suivent le rang des dates d’auteur, pas leur écart dans le temps : un fichier écrit en deux semaines utilise donc la même plage qu’un fichier écrit sur dix ans. Les lignes non commitées prennent la nuance la plus récente.
  • sur la première ligne de chaque bloc issu du même commit : le résumé, l’auteur et la date relative, ou Pas encore commité pour les modifications locales,
  • le numéro de ligne et le code.

yaggui exécute git blame --incremental <commit> -- <path>. Pour la copie de travail, il envoie le fichier présent sur le disque à git blame --incremental --contents - -- <path>. La vue indique « Attribution de chaque ligne… » pendant le traitement.

Cliquez sur une ligne : toutes les lignes du même commit sont mises en évidence, et le commit est sélectionné dans le graphe, de sorte que le panneau de détail du commit suit. Le blame reste ouvert. La barre Commit sélectionné en bas affiche son SHA court, son résumé, son auteur et sa date, avec deux boutons :

  • Blame du parent : fait le blame du fichier tel qu’il était juste avant ce commit, et défile jusqu’à l’endroit où se trouvaient ces lignes. Il suit les renommages. Il est désactivé, avec « Ces lignes ont été ajoutées avec le fichier », quand il n’existe pas de version antérieure.
  • Voir dans le graphe : ferme le blame et affiche le commit dans le graphe.

Chaque Blame du parent ajoute une étape à un fil : le bouton Revenir à version dans l’en-tête ramène à la version précédente. Fermer le blame, ou ouvrir un autre blame, un historique de fichier ou le reflog, efface ce fil.

Action Comment
Bloc suivant / précédent ↓ / ↑ dans la grille
Blame du parent, Voir dans le graphe, Historique du fichier, Copier le SHA Clic droit sur une ligne
Retour au graphe Esc ou Graphe

Voir dans le graphe et Copier le SHA sont désactivés sur les lignes non commitées.

Un blame de la copie de travail se met à jour quand le fichier ou les branches changent. Un blame à un commit ne change jamais : yaggui le conserve.

  • Fichiers longs : seules les lignes visibles sont dessinées, si bien que des fichiers de plusieurs dizaines de milliers de lignes s’ouvrent et défilent normalement.
  • Fichiers binaires : « Fichier binaire (48,2 KB) : pas de lignes à attribuer. »
  • Fichier pas encore commité (nouveau ou non suivi), examiné depuis la copie de travail : « Ce fichier n’est pas encore commité : aucune ligne n’a d’historique. »
  • Fichier vide : « Ce fichier est vide. »
  • Fichier supprimé de la copie de travail : le blame affiche la version de HEAD.
  • Lien symbolique : le blame affiche le chemin cible du lien sous forme de texte.
  • Historique d’un gros fichier : le diff de chaque commit passe par le garde-fou de taille du visualiseur de diff (« Diff volumineux non affiché », avec Afficher quand même), voir Consulter les diffs.

Si la lecture échoue, la vue affiche « Impossible de lire l’historique du fichier » ou « Impossible de faire le blame du fichier » avec Réessayer ; la commande figure dans le journal des commandes.

L’historique d’un fichier et le blame ne font que lire : il n’y a rien à annuler.