我想找到修改源文件的最近提交。

我可以使用git blame来查看每行提交的所有日期,但是很难确切地看到最后一次接触文件的是哪一次提交。

我如何才能找到最后一次提交,触及我的git存储库中的给定文件?


Git日志支持查看特定文件(和目录)的历史记录,所以你可以这样调用它:

git log my/file.c

如果你真的只想列出最近的一次提交,例如在脚本中使用它,使用-n 1选项:

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

——pretty=format:%h告诉git日志只显示提交散列。——separater阻止文件名被解释为提交名,以防它有歧义。


我不确定这是否是你想要的,但如果你做一个git log <thefile>来获得修改该文件的提交。你可以选最上面的那个。应该就是你要找的那个。


一旦你有了你想要使用git log FILENAME查看的提交的SHA id,你应该能够执行git show SHA_ID_HERE来查看你对特定的提交做了什么。你甚至不需要输入整个ID;前6个字符就足够了。


要在一行中获得ref,请尝试:

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

如果你只想获得最新提交的哈希值来修改特定的文件集(并想避免awk),你可以使用:

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

这对于获得随后与git describe一起使用的提交散列非常有用。

例如(以防对任何人有用)……

我通过考虑修改任何源文件的最新提交来创建当前版本id(假设你用像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

这会产生如下id:

Mycode-1.2.1—当源文件的当前状态对应于带标签的版本时 Mycode-1.2.1-g3k7s2—当源文件的当前状态对应于带有标记的版本之后的提交时 myde -1.2.1-g3k7s2-mod -当源文件的当前状态自标记版本之后的最后一次提交以来已被修改时 未知真菌-当还没有创建版本标签


如果你只是想找到最近的提交,那么你不需要git-log,你需要git-rev-list,它列出了提交路径中修改该文件的提交对象,从最近的一个(按时间顺序)开始。简单地说:

Git rev-list -1 <提交> <文件名>

对于git-rev-list,你只需要提供:

要包含的提交数量,或者-1只表示最近的提交, 开始回溯的分支(或提交id),如果您已经在上面,则为HEAD,如果您想要所有已知的提交,则为——all 文件的相对路径。

这只是返回当前分支中用于修改该文件的最新提交ID,例如:215095e2e338525be0baeeebdf66bfbb304e7270

对于一个更复杂的例子,你可以使用标签名,甚至远程引用,并包含带有通配符的相对路径名,例如ex:

Git rev-list origin/user/bob/testbranch -1 src/bfiles/*.txt

...这将告诉您该分支历史中通配符匹配的最近更改是什么。rev-list的选项是极端的,它是最重要的管道命令之一,所以你可以根据你能想象到的任何标准来包括或排除。

当然,参考git-rev-list(1)手册页。