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

searching commit messages in the whole git repo

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

你说得对,你需要 --all(或者你可能需要 --branches)。

"Intuitive" 在 git 中有点棘手,git log 的行为对我来说是 直观的,但这只是因为我'我们研究了 git 及其关于如何使用提交图的特殊概念。

log 命令与所有其他提交图遍历命令没有太大区别。它们都像——事实上,许多然后简单地 运行,或 运行,然后使用 git rev-list 的输出。您给它一些起始点提交 ID,或一些名称或 gitrevisions 中描述的任何语法,它会找到可从这些 ID 访问的每个提交的 SHA-1 ID。

回购中的每个提交——包括已经"abandoned"的提交(但仍然可以通过reflogs找到)因为rebase复制操作,提交存储堆栈,甚至 git notes 提交——都是这样工作的,所以 git log 找到所有提交是不好的。即使 --all 标志实际上也找不到所有提交。

如果您仔细阅读 the git rev-list documentation, you'll see that --all means "every reference in the refs/ namespace" (hence all branches, all tags, and notes, but not special references like ORIG_HEAD left behind after a rebase, nor any reflog entries, for instance). The same wording appears in the git log documentation,但我喜欢推荐人们参考 git rev-list,因为我认为它最终更能说明问题。

git log是一个遍历commit graph并打印commit信息的工具。 --grep 是此遍历上的 过滤器


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

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

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

git log | grep foo

默认值应该最适合最常见的情况。 difflog等命令在开发中使用最多。整合很少发生。所以默认值是针对开发人员的。

开发人员 git log 的常见用途是寻找促成此提交的更改。他们正在寻找 "why is this written like this?" 或 "where did this bug come from?" 问题的答案。这就是为什么默认是从当前提交开始遍历图形。您很少想要搜索尚未合并到您的代码中的提交,这更多是集成管理器的任务。

--grep 不会更改提交 git log 访问的内容。如果它暗示 --all,那将是令人惊讶和不灵活的。令人惊讶,因为它会混淆 "filter" 的含义,而且您很少想搜索不相关的分支。不灵活,因为您如何只搜索某些提交?我想你可能需要一个 --no-all 来关闭它,然后可能需要更多开关,可能 --branches,才能明白你的意思。

具有多个默认行为的情况很少见,但这通常是一场噩梦。最好牢记一个固定的通用用例(开发),而不是猜测罕见的用例(集成)。让极少数情况下明确他们想要什么。