这是how to list commits on a branch but not merged branches的反转,所以我会以相同的格式询问它。假设我的git commit历史如下:
A---B---C---D---E---F master
\ /
X---Y---Z topic
如何列出topic
分支上的提交 - 即X
,Y
和Z
?请注意,仅仅执行git log topic
将无效 - 这也将返回提交A
和B
。
我以为我可以运行git merge-base topic master
来查找B
,然后执行git log B..Z
来获取这些提交。不幸的是,git merge-base topic master
会返回Z
,而不是B
,这在回顾过程中是有道理的 - 因为Z
已经合并到master,topic
和master
之间的第一次提交共享历史记录的Z
为{{1}}。
答案 0 :(得分:1)
您可以使用以下命令:
git log topic --not $(git rev-list master ^topic --merges | tail -1)^
git rev-list master ^topic --merges
返回从master
到topic
的所有合并提交的SHA-1密钥;因为有可能存在多个合并提交,所以我使用tail -1
来获取最后一次合并提交,即master
和topic
的合并提交。
然后我们记录topic
的所有提交,同时省略合并提交的第一个父项的所有提交(--not <merge-commit>^
)。
要有效地使用此命令,我将按如下方式定义别名:
git config --global alias.<alias-name> '!f() { git log $1 --not $(git rev-list $2 ^$1 --merges | tail -1)^; }; f'
然后可以像git <alias-name> topic master
那样使用。
仅供参考:
在我的git版本(1.9.0)中,如果省略tail
它也可以工作,但我认为只返回相关的SHA-1密钥会更简洁。
答案 1 :(得分:0)
如果您只将 topic
合并到 master
一次,并且您知道在合并提交 {{1} 中将 topic
合并到 master
}},您可以简单地使用 <rev>^-<n>
revision syntax:
E
如果您不记得提交 git log E^-
的哈希值,并且想要一种基于分支名称 (E
) 的简单方法来找到它,您可以使用以下答案之一问题"Find merge commit which include a specific commit"。我个人喜欢git when-merged
:
topic
综合起来:
git when-merged topic
如果您多次将 git log $(git when-merged -c topic)^-
合并到 topic
,那么上面的语法将仅列出在最近的合并提交中合并的提交。在这种情况下,您可以使用 Rocketraman 的 mergedtopiclg
alias
master
为了完整起见,这个别名被配置为
git mergedtopiclg $(git when-merged -c topic)