Je veux trouver le commit le plus récent qui a modifié un fichier source.
Je peux utiliser git blame
pour voir toutes les dates de commits par ligne, mais il est difficile de voir exactement quel commit a été le dernier à toucher le fichier.
Comment puis-je trouver le dernier commit qui a touché un fichier donné dans mon dépôt git?
--all
option.Si vous voulez juste trouver le commit le plus récent, alors vous ne voulez pas
git-log
, vous voulezgit-rev-list
, qui répertorie les objets de commit modifiant ce fichier, dans ce chemin de commit, en commençant par le plus récent (chronologiquement). Tout simplement:git rev-list -1 <commit> <filename>
Car
git-rev-list
dans votre cas, il vous suffit de fournir:Cela renvoie simplement l'ID de validation le plus récent dans la branche actuelle pour modifier ce fichier, ex:
215095e2e338525be0baeeebdf66bfbb304e7270
Pour un exemple plus complexe, vous pouvez utiliser des noms de balises, et même des références distantes, et inclure des noms de chemins 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 quel a été le changement le plus récent de la correspondance générique dans l'histoire de cette branche. Les options pour la liste des rév.sont extrêmes, c'est l'une des commandes de plomberie les plus importantes, vous pouvez donc inclure ou exclure selon à peu près tous les critères que vous pouvez imaginer.
Bien sûr, reportez-vous à la page de manuel de git-rev-list (1) .
la source
git-log
est inférieure.git-log
est de la porcelaine,git-rev-list
est la plomberie.Si vous souhaitez simplement obtenir le hachage du dernier commit pour modifier un ensemble spécifique de fichiers (et que vous voulez éviter
awk
), vous pouvez utiliser:git log -n 1 --pretty=format:%h -- <path>
Cela peut être utile pour obtenir le hachage de validation pour une utilisation ultérieure avec
git describe
.Par exemple (au cas où cela serait utile pour n'importe qui)…
Je crée un identifiant de version actuelle en considérant le dernier commit pour changer n'importe quel fichier source (en supposant que vous marquez les versions avec des balises comme
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 baliséemycode-1.2.1-g3k7s2
- lorsque l'état actuel des fichiers source correspond à un commit suivant une version baliséemycode-1.2.1-g3k7s2-mod
- lorsque l'état actuel des fichiers sources a été modifié depuis le dernier commit suite à une version taguéemycode-unknown
- lorsqu'il n'y a pas encore eu de balise de version crééela source
$VN
ressemble à une sorte de cauchemar de morts-vivants SVNJe 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.la source
git log -n1 -- <thefile>
(ou dirigez la sortie vershead -1
si vous voulez gaspiller des ressources), vous n'avez pas à choisir manuellement la ligne du haut (voir la réponse de Jo Liss )-n
et utiliser-1
directement.Pour obtenir uniquement la référence sur une ligne, essayez:
la source
Une fois que vous avez l'ID SHA du commit que vous souhaitez utiliser
git log FILENAME
, vous devriez pouvoir fairegit show SHA_ID_HERE
pour voir ce que vous avez fait pour ce commit particulier. Vous n'avez même pas besoin de saisir l'ID complet; les 6 premiers caractères devraient suffire.la source
git show $(git log -1 --pretty="%H" -- FILENAME)