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

Cor*_*ein 163 git search

我想找到修改源文件的最新提交.

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

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

Jo *_*iss 201

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

git log my/file.c
Run Code Online (Sandbox Code Playgroud)

如果你真的只想列出了一个最新的承诺,例如在脚本中使用它,你可以使用-n 1:

git log -n 1 --pretty=format:%H -- my/file.c
Run Code Online (Sandbox Code Playgroud)

--pretty=format:%h告诉git log我只显示提交哈希值(感谢TheBamf).在--分体从得到解释为提交的名称停止文件名,以防万一它是不明确的.

  • 如果您想知道文件的最后一次修改,无论分支是什么,您可以通过添加`--all`选项来考虑所有分支. (10认同)

Mic*_*son 41

如果您只是想查找最近的提交,那么您不希望git-log,您希望git-rev-list在该提交路径中列出更改该文件的提交对象,从最新的提交开始(按时间顺序排列).简单的说:

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

对于git-rev-list您的情况,您只需提供:

  • 提交的数目包括,或-1为只有最近,
  • 分支(或提交id)开始向后看,HEAD如果你已经在它上面,或者--all如果你想要所有已知的提交,
  • 文件的相对路径.

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

对于更复杂的示例,您可以使用标记名称,甚至远程引用,并包含带通配符的相对路径名,例如:

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

...哪个会告诉你最近的变化是对该分支历史中的通配符匹配的影响.rev-list的选项是极端的,它是最重要的管道命令之一,因此您可以包含或排除您可以想象的任何标准.

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

  • 我不会说劣等,只是它默认提供了无关的信息.git-rev-list只返回提交ID,如果您要将响应提供给脚本或其他自动化过程,这就是您想要的.git-log返回有关所选提交的信息,首先使用git-rev-list收集提交ID,然后收集每次提交的信息.如果您只是要过滤掉提交信息并使用ID,那么您可以首先使用git-rev-list.由于log基于rev-list,因此它需要大多数相同的过滤器参数. (5认同)
  • `git-log`是瓷器,`git-rev-list`是管道. (3认同)

The*_*amf 27

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

git log -n 1 --pretty=format:%h -- <path>
Run Code Online (Sandbox Code Playgroud)

这对于获取随后使用的提交哈希非常有用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
Run Code Online (Sandbox Code Playgroud)

这会产生如下的ID:

  • mycode-1.2.1 - 当源文件的当前状态对应于标记版本时
  • mycode-1.2.1-g3k7s2 - 当源文件的当前状态对应于标记版本之后的提交时
  • mycode-1.2.1-g3k7s2-mod - 自标记版本之后的上次提交以来修改了源文件的当前状态
  • mycode-unknown - 尚未创建版本标记时

  • `$ VN`看起来像某种噩梦不死的SVN (4认同)

Nou*_*him 10

我不确定这是否是你想要的,但如果你做了一个git log <thefile>获取改变该文件的提交.你可以挑选最顶层的.它应该是你正在寻找的那个.

  • 如果你使用`git log -n1 - <thefile>`(或者如果你想浪费资源,将输出管道输出到`head -1`)你不必手动选择顶线(参见Jo Liss的[答案]) (http://stackoverflow.com/questions/4784575/how-do-i-find-the-most-recent-git-commit-that-modified-a-file/4784629#4784629)) (4认同)
  • 好点子.我想你也可以跳过`-n`并直接使用`-1`. (4认同)