web-dev-qa-db-fra.com

Comment trouver le dernier git commit ayant modifié un fichier?

Je veux trouver le dernier commit qui a modifié un fichier source.

Je peux utiliser git blame pour voir toutes les dates des commits pour chaque ligne, mais il est difficile de savoir exactement quel commit a été le dernier à toucher le fichier.

Comment trouver le dernier commit ayant touché un fichier donné dans mon référentiel git?

156
Cory Klein

git log permet de consulter l'historique de fichiers (et de répertoires) spécifiques. Vous pouvez donc l'appeler ainsi:

git log my/file.c

Si vous souhaitez uniquement répertorier la validation la plus récente , par exemple pour l'utiliser dans un script, utilisez la commande -n 1 option:

git log -n 1 --pretty=format:%H -- my/file.c

--pretty=format:%h dit à git log pour afficher uniquement le hachage de commit. Le -- separater empêche le nom de fichier d'être interprété comme un nom de validation, juste au cas où il serait ambigu.

191
Jo Liss

Si vous voulez juste trouver le dernier commit, alors vous ne voulez pas git-log, tu veux git-rev-list, qui répertorie les objets de validation modifiant ce fichier dans le chemin de validation, en commençant par le plus récent (chronologiquement). Tout simplement:

git rev-list -1 <commit> <filename>

Pour git-rev-list _ dans votre cas, vous venez de fournir:

  • Le nombre de commits à inclure, ou - 1 uniquement pour le plus récent,
  • La branche (ou l'ID de validation) à partir de laquelle chercher depuis le début, [~ # ~] head [~ # ~] si vous y êtes déjà, ou - all si vous voulez tous les commits connus, et
  • Le chemin relatif à votre fichier.

Cela renvoie simplement l'ID de validation le plus récent de la branche en cours pour modifier ce fichier, ex: 215095e2e338525be0baeeebdf66bfbb304e7270

Pour un exemple plus complexe, vous pouvez utiliser des noms de balises, voire des références distantes, et inclure des noms de chemin relatifs avec des caractères génériques, par exemple:

git rev-list Origin/user/bob/testbranch -1 src/bfiles/*.txt

... Ce qui vous dirait quelle est la modification la plus récente apportée à la correspondance générique dans l'historique de cette branche. Les options pour rev-list sont extrêmes. Il s’agit de l’une des commandes de plomberie les plus importantes. Vous pouvez donc inclure ou exclure tout critère de votre choix.

Bien sûr, référez-vous à la page Page de manuel de git-rev-list (1) .

35
Michael Erickson

Si vous voulez juste obtenir le hash du dernier commit pour modifier un ensemble spécifique de fichiers (et voulez éviter awk), vous pouvez utiliser:

git log -n 1 --pretty=format:%h -- <path>

Cela peut être utile pour obtenir le hash de commit pour une utilisation ultérieure avec git describe.

Par exemple (au cas où cela serait utile pour quelqu'un)…

Je crée un identifiant de version actuelle en prenant en compte le dernier commit pour modifier n’importe quel fichier source (en supposant que vous marquiez les versions avec des balises telles que mycode-1.2.1):

COMMIT=$(git log -n 1 --pretty=format:%h -- *.c *.h)
if VN=$(git describe --always --abbrev=5 --match "mycode-*" $COMMIT 2>/dev/null) &&
case "$VN" in
mycode-*)
    git update-index -q --refresh
    test -z "$(git diff-index --name-only HEAD *.c *.h)" ||
    VN="$VN-mod" ;;
*) VN="mycode-unknown-g$VN" ;;
esac
then
    continue
else
VN="mycode-unknown"
fi

Cela produit des identifiants comme:

  • mycode-1.2.1 - lorsque l’état actuel des fichiers source correspond à une version marquée
  • mycode-1.2.1-g3k7s2 - lorsque l’état actuel des fichiers source correspond à une validation après une version marquée
  • mycode-1.2.1-g3k7s2-mod - lorsque l'état actuel des fichiers source a été modifié depuis le dernier commit suivant une version étiquetée
  • mycode-unknown - quand aucune balise de version n'a encore été créée
26
TheBamf

Je ne sais pas si c'est ce que vous voulez, mais si vous faites un git log <thefile> pour obtenir les commits qui ont modifié ce fichier. Vous pouvez choisir le plus haut. Ce devrait être celui que vous recherchez.

9
Noufal Ibrahim

Une fois que vous avez l'ID SHA du commit que vous souhaitez utiliser, utilisez git log FILENAME, vous devriez pouvoir faire git show SHA_ID_HERE pour voir ce que vous avez fait pour ce commit particulier. Vous n'avez même pas besoin d'entrer l'ID complet; les 6 premiers caractères devraient suffire.

1
Joe

pour obtenir le ref sur une seule ligne, essayez:

git log -n1 --oneline <path> | awk '{print $1;}'
0
fastmultiplication