【问题标题】:git - Find commit where file was addedgit - 查找添加文件的提交
【发布时间】:2018-06-16 10:05:09
【问题描述】:

假设我有一个文件foo.js 不久前提交。我想 只需找到首次添加此文件的提交即可。

在阅读了答案和我自己的修补后,这对我有用

git log --follow --diff-filter=A --find-renames=40% foo.js

【问题讨论】:

  • 这比任何答案都好,因为它跟踪重命名的文件。
  • 认为在某些极端情况下,这可能会返回多个结果,例如当一个文件被添加然后被删除并在另一个提交中再次添加时(即不是重命名)。 Seth Robinson's answer 似乎可以处理这些情况。
  • 出于兴趣,您是如何决定--find-renames 的 40% 的?似乎对我来说工作得很好,并拿起了一些 --follow 自己没有的东西,只是好奇......

标签: git commit git-commit git-log


【解决方案1】:
git log --follow --find-renames=40% --oneline -- foo.js | tail -n 1

【讨论】:

  • 我很高兴有--follow
  • 接受的解决方案对我不起作用,但确实如此。谢谢!
  • 我已经编辑了答案以包括 --follow--find-renames=40% 所以它会跟随文件重命名并找到原作者 - 希望这没问题?
【解决方案2】:

这是一种更简单的“纯 Git”方式,无需管道:

git log --diff-filter=A -- foo.js

检查文档。您可以对 Deleted、Modified 等执行相同的操作。

https://git-scm.com/docs/git-log#Documentation/git-log.txt---diff-filterACDMRTUXB82308203

我有一个方便的别名,因为我总是忘记它:

git config --global alias.whatadded 'log --diff-filter=A'

这使它变得如此简单:

git whatadded -- foo.js

下面一行将递归搜索$PWD的子目录foo.js,而无需提供文件的绝对或相对路径,也不需要文件与@987654328在同一目录中@

git log --diff-filter=A -- **foo.js

【讨论】:

  • +1!但是,我的文件在一个子文件夹中,所以只有在我在前面添加一个星号 git log --diff-filter=A -- *subfolder/foo.js 后才能工作
  • 这如何处理从其他分支合并的文件,但这些文件不一定添加到执行合并的用户正在合并的分支中?
  • 上面的文档链接不会跳转到标志信息。也许自从发布以来它改变了。 git-scm.com/docs/git-log#Documentation/…
  • 是的,他们改变了文档中的锚结构。已更新,谢谢!
  • @geo 我想我明白你在说什么,但不是真的,但我有类似的用例,我通常留在 git 目录的项目根目录中并从那里发出命令,并使用提供的一个衬里git log --diff-filter=A -- foo.js 没有在我的终端中将提交 ID / 哈希打印到 STDOUT,而是我必须从 git repo root 提供文件的相对路径才能获得所需的结果
【解决方案3】:

以下内容可能你不感兴趣,但我认为它会在未来对你有所帮助,并且是 Git 调试生态系统的一部分:

您可以使用git-blame 显示上次修改文件每一行的版本和作者,尤其是文件注释。访问https://git-scm.com/book/en/v2/Git-Tools-Debugging-with-Git

例如,

git blame -L 174,190  xx.py

-L 选项将注释的输出限制在第 174 行到第 190 行,因此您将看到文件 xx.py 从第 174 行到第 190 行的作者和提交哈希等

【讨论】:

  • 您能解释一下每个操作数的作用吗?我知道您提供了相关 rtfm 的链接,但稍加说明将使您的帖子成为一站式商店。
  • 正如 Pro-Git 书中所说,如果您在代码中追踪错误并想知道它是何时引入的以及为什么引入,文件注释通常是您最好的工具。它向您展示了最后一次修改任何文件的每一行的提交,因此我展示的这个示例使用 -L 选项将输出限制为第 174 到 190 行,最后一件事就是您要检查的目标文件( xx.py) 在这种情况下是一个 python 文件@rossmcm
【解决方案4】:

如果它是非编程方式的替代方法,这非常快。打开 gitk GUI。

gitk file

然后滚动到第一个提交

【讨论】:

    猜你喜欢
    • 2020-07-18
    • 2013-11-11
    • 2012-08-23
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 2016-10-16
    相关资源
    最近更新 更多