在整个 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
默认值应该最适合最常见的情况。 diff
和log
等命令在开发中使用最多。整合很少发生。所以默认值是针对开发人员的。
开发人员 git log
的常见用途是寻找促成此提交的更改。他们正在寻找 "why is this written like this?" 或 "where did this bug come from?" 问题的答案。这就是为什么默认是从当前提交开始遍历图形。您很少想要搜索尚未合并到您的代码中的提交,这更多是集成管理器的任务。
--grep
不会更改提交 git log
访问的内容。如果它暗示 --all
,那将是令人惊讶和不灵活的。令人惊讶,因为它会混淆 "filter" 的含义,而且您很少想搜索不相关的分支。不灵活,因为您如何只搜索某些提交?我想你可能需要一个 --no-all
来关闭它,然后可能需要更多开关,可能 --branches
,才能明白你的意思。
具有多个默认行为的情况很少见,但这通常是一场噩梦。最好牢记一个固定的通用用例(开发),而不是猜测罕见的用例(集成)。让极少数情况下明确他们想要什么。
我想了解 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
默认值应该最适合最常见的情况。 diff
和log
等命令在开发中使用最多。整合很少发生。所以默认值是针对开发人员的。
开发人员 git log
的常见用途是寻找促成此提交的更改。他们正在寻找 "why is this written like this?" 或 "where did this bug come from?" 问题的答案。这就是为什么默认是从当前提交开始遍历图形。您很少想要搜索尚未合并到您的代码中的提交,这更多是集成管理器的任务。
--grep
不会更改提交 git log
访问的内容。如果它暗示 --all
,那将是令人惊讶和不灵活的。令人惊讶,因为它会混淆 "filter" 的含义,而且您很少想搜索不相关的分支。不灵活,因为您如何只搜索某些提交?我想你可能需要一个 --no-all
来关闭它,然后可能需要更多开关,可能 --branches
,才能明白你的意思。
具有多个默认行为的情况很少见,但这通常是一场噩梦。最好牢记一个固定的通用用例(开发),而不是猜测罕见的用例(集成)。让极少数情况下明确他们想要什么。