git log - 带前缀的分支

时间:2016-05-18 12:02:28

标签: git git-log

我想记录一组特定分支上的所有更改以查看它们之间的关系,我发现:

git log --graph --oneline --topo-order --decorate --simplify-by-decoration `git branch --list -a origin/foo/*`

完全符合我的要求(即所有以foo /*为前缀的分支上的日志更改)。

但现在我对git log的--branches选项感到好奇。似乎应该以类似的方式工作,但如果我使用--branches=origin/foo/*--branches=remotes/origin/foo*或甚至--branches=foo,则输出非常不同(只显示极少数和不相关的提交)。< / p>

文件说:

--branches[=<pattern>]
Pretend as if all the refs in refs/heads are listed on the command line as
<commit>. If <pattern> is given, limit branches to ones matching given shell
glob. If pattern lacks ?, *, or [, /* at the end is implied.

有什么区别?我的问题已经解决,因为我可以使用第一个版本 - 但我问这个,因为我很好奇。 (如果可以避免使用后退滴答,那么添加git别名会稍微简单。)

This question讨论相关主题 - 但我看不到有关我具体问题的任何信息。

1 个答案:

答案 0 :(得分:7)

说明

现在这是一个完美的案例“你需要了解git的内部知识才能理解文档”。我们需要的更少。

--branches的文档说明它适用于“refs / heads 中的refs ”。远程跟踪引用不在refs/heads中,它们位于refs/remotes中。因此,在寻找“origin / foo / *”时,不会找到任何分支。因此git log将恢复为默认行为,即从HEAD开始发现提交。

解决方案

您需要使用--remotes选项,该选项与--branches类似,但适用于refs/remotes中的引用。这就变成了:

git log --graph --oneline --topo-order --decorate --simplify-by-decoration --remotes='origin/foo/*'

或者,您可以使用适用于所有分支的--glob,但是您需要添加heads/remotes/,或使用通配符。例如:

git log --graph --oneline --topo-order --decorate --simplify-by-decoration --glob='refs/*/foo/*'

关于你的第一个命令

在旁注中,你的第一个命令在所有情况下都不起作用,因为你在反引号中使用了git branch,这是一个瓷器命令。它可能会在未来中断,因为瓷器命令的输出可能会发生变化。事实上,它确实在某些情况下已经破裂,例如当您列出HEAD时。例如:

git log --graph --oneline --topo-order --decorate --simplify-by-decoration $(git branch --list -a 'origin/*')

这个命令给了我一个错误,说它无法识别->作为参数。这是因为git branch的输出:

remotes/origin/HEAD -> origin/master
remotes/origin/master

要使命令在所有情况下都能正常工作并且面向未来,您可以使用git for-each-ref(这是一个管道命令),如下所示:

git log --graph --oneline --topo-order --decorate --simplify-by-decoration $(git for-each-ref --format='%(refname)' 'refs/remotes/origin/*')