Git:如何列出合并分支上的提交?

时间:2014-05-07 14:08:39

标签: git merge branch history

这是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分支上的提交 - 即XYZ?请注意,仅仅执行git log topic将无效 - 这也将返回提交AB

我以为我可以运行git merge-base topic master来查找B,然后执行git log B..Z来获取这些提交。不幸的是,git merge-base topic master会返回Z,而不是B,这在回顾过程中是有道理的 - 因为Z已经合并到master,topicmaster之间的第一次提交共享历史记录的Z为{{1}}。

2 个答案:

答案 0 :(得分:1)

您可以使用以下命令:

git log topic --not $(git rev-list master ^topic --merges | tail -1)^

git rev-list master ^topic --merges返回从mastertopic的所有合并提交的SHA-1密钥;因为有可能存在多个合并提交,所以我使用tail -1来获取最后一次合并提交,即mastertopic的合并提交。

然后我们记录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)