我如何find修改文件的最近的git提交?

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

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

我怎样才能find最后一个提交在我的git仓库中给定的文件?

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

 git log my/file.c 

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

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

--pretty=format:%h告诉git log只显示提交哈希(感谢TheBamf)。 --分隔符将文件名称解释为提交名称,以防万一。

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

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

这对获取提交散列以便随后使用git describe可能很有用。

例如(万一它对任何人有用)…

我通过考虑最新的提交来更改任何源文件来创build当前的版本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 – 当还没有创build版本标签时

如果你只是想find最近的提交,那么你不希望git-log ,你想git-rev-list ,列出提交对象改变该文件,在该提交path,从最新的一个开始按时间顺序)。 简单的说:

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

对于你的情况下的git-rev-list ,你只需要提供:

  • 包含的提交数量,或者仅用于最近的提交数量,
  • 分支(或提交ID)开始回头看,如果你已经在头上 ,或者 – 如果你想要所有已知的提交,
  • 您的文件的相对path。

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

对于一个更复杂的例子,你可以使用标签名称,甚至是远程引用,并且包含相对path名和通配符,例如:

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

…这将告诉你最近的变化是在该分支的历史中的通配符匹配。 rev-list的选项是极端的,它是最重要的pipe道命令之一,所以你可以包括或排除任何你可以想象的标准。

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

我不知道这是否是你想要的,但如果你做一个git log <thefile>来获取改变该文件的提交。 你可以select最上面的一个。 它应该是你正在寻找的那个。

一旦你有使用git log FILENAME的提交的SHA ID,你应该可以做git show SHA_ID_HERE来看看你为那个特定的提交做了什么。 你甚至不需要input整个ID; 前6个字符应该足够了。

为了只在一行上获得参考,请尝试:

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