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

sin*_*boy 6 git merge history branch

这与如何列出分支上的提交而不是合并的分支相反,所以我会以相同的格式询问它。假设我的 git 提交历史如下所示:

A---B---C---D---E---F master
     \         /
      X---Y---Z topic
Run Code Online (Sandbox Code Playgroud)

我如何列出topic分支上的提交——也就是XY、 和Z?需要注意的是简单地做git log topic是行不通的-这将返回提交A,并B为好。

我原以为我可以跑去git merge-base topic masterfind B,然后做得到git log B..Z这些提交。不幸的是,git merge-base topic master返回Z,而不是B,回想起来Z是有道理的——因为已经合并到 master,topicmaster那个共享历史记录之间的第一次提交是Z.

phi*_*ilb 5

如果您只合并topic一次master 并且您知道您在合并提交中合并topic了,则可以简单地使用修订语法masterE<rev>^-<n>

git log E^-
Run Code Online (Sandbox Code Playgroud)

如果您不记得提交的哈希值E,并且想要一种简单的方法来根据分支名称 ( ) 找到它,您可以使用问题“查找包含特定提交的合并提交”topic中的答案之一。我个人喜欢:git when-merged

git when-merged topic
Run Code Online (Sandbox Code Playgroud)

把它们放在一起:

git log $(git when-merged -c topic)^-
Run Code Online (Sandbox Code Playgroud)

如果您topic多次合并到master,那么上面的语法将仅列出在最近一次合并提交中合并的提交。在这种情况下,您可以使用 Rocketraman 的mergedtopiclg别名

git mergedtopiclg $(git when-merged -c topic)
Run Code Online (Sandbox Code Playgroud)

为了完整起见,此别名配置为

git log E^-
Run Code Online (Sandbox Code Playgroud)


Sas*_*olf 4

您可以使用以下命令:

git log topic --not $(git rev-list master ^topic --merges | tail -1)^
Run Code Online (Sandbox Code Playgroud)

git rev-list master ^topic --mergesmaster返回从到的所有合并提交的 SHA-1 密钥topic;因为可能有多个合并提交,我用它来获取最后一个合并提交,即和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'
Run Code Online (Sandbox Code Playgroud)

然后就可以像这样使用了git <alias-name> topic master


仅供您参考:
在我的 git 版本(1.9.0)中,如果您省略它也可以工作tail,但我认为仅返回相关的 SHA-1 密钥会更干净。

  • 这似乎根本不起作用——它让我得到了很多额外的承诺。 (3认同)