我想记录一组特定分支上的所有更改以查看它们之间的关系,我发现:
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讨论相关主题 - 但我看不到有关我具体问题的任何信息。
答案 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/*')