在整个git仓库中搜索提交消息

时间:2015-12-08 21:47:00

标签: git grep git-log

我想了解git log --all --grep=<>git log --grep=<>之间的区别。我的目标是在搜索时遍历整个仓库。如果我不添加--all,是否意味着我将错过分支中的所有提交消息?看起来像是一个非直观的默认值。

2 个答案:

答案 0 :(得分:1)

您在此处需要--all(或者您可能需要--branches),这是正确的。

&#34;直观&#34;在git中有点棘手,git log 的行为对我来说是直观的,但这只是因为我研究了git及其如何处理提交图的特殊概念。

log命令与所有其他commit-graph-traversing命令没有太大区别。它们都像 - 事实上,许多只是运行,或运行,然后使用 - git rev-list的输出。您可以为它提供一些起始点提交ID,或某些名称或gitrevisions中描述的任何语法,并且它会找到每个提交的SHA-1 ID。

每个提交在repo中 - 包括已被放弃的提交&#34; (但仍然可以通过reflogs找到)因为rebase复制操作,存储堆栈上的提交,甚至是git notes提交 - 都是这样工作的,所以git log查找所有内容都不好提交。即使--all标志实际上也找不到所有提交。

如果您仔细阅读the git rev-list documentation,则会发现--all表示refs/命名空间中的每个引用&#34; (因此所有分支,所有标签和注释,但不是像ORIG_HEAD之类的特殊引用,例如在rebase之后,也没有留下任何reflog条目)。同样的措辞出现在the git log documentation中,但我喜欢将人们推荐给git rev-list,因为我觉得它最终会更具启发性。

答案 1 :(得分:1)

git log是用于遍历提交图并打印提交信息的工具。 --grep是此导线上的过滤器

git log从您当前的提交开始(即HEAD),并从那里回溯历史记录。

git log --all访问所有提交。这是非常罕见的,偶尔需要集成商。

--grep是一个过滤器。它会过滤git log访问过的提交流。仅过滤删除条目,从不添加。对于每次提交git log次访问,--grep决定是否应包含该提交。如果你把它想象成普通的Unix管道,可能会更有意义。

git log | grep foo

默认值最适合最常见的情况。像difflog这样的命令最常用于开发。整合发生得更少。所以默认值是针对开发人员的。

git log对开发人员的常见用法是寻找导致此提交的更改。他们正在寻找问题的答案“为什么这样写?”或“这个bug来自哪里?”。这就是为什么默认是从当前提交中走出图形的原因。您很少想要搜索尚未合并到代码中的提交,这更像是集成管理器的任务。

--grep不会更改提交git log次访问的内容。如果它暗示--all,那将是令人惊讶和不灵活的。令人惊讶的是,它会混淆“过滤器”的含义,而且你很想搜索不相关的分支。不灵活,因为你如何只搜索某些提交?我想你可能需要--no-all来关闭它,然后可能需要更多的开关,可能是--branches,以获得你的意思。

在极少数情况下,有多个默认行为可以解决,但这通常是一场噩梦。最好有一个坚定的常见用例(开发),而不是猜测罕见的情况(集成)。让罕见的情况明确表达他们想要的东西。