如何找到最近修改文件的git提交?

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

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

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

97956 次浏览

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

git log my/file.c

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

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

--pretty=format:%h告诉git log只显示提交哈希。--分隔符阻止文件名被解释为提交名称,以防它有歧义。

我不确定这是否是你想要的,但如果你做一个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 -当源文件的当前状态对应于一个带标签的版本后的提交
  • mycode-1.2.1-g3k7s2-mod -当源文件的当前状态自上次提交后被修改
  • mycode-unknown -当还没有创建版本标签时

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

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

对于你的例子中的git-rev-list,你只需要提供:

  • 要包含的提交数量,或者-1仅用于最近的提交,
  • 开始回溯的分支(或提交id),如果你已经在它上面,则为,如果你想要所有已知的提交,则为——所有,以及
  • 文件的相对路径。

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

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

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

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

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