Git:如何列出已合并分支的提交记录?

8
这是如何列出分支上的提交记录但不包括已合并的分支的逆向操作,因此我将以相同的格式提问。假设我的git提交历史记录如下:
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已经合并到了主分支,所以在topicmaster之间共享历史的第一个提交是Z

2个回答

5
如果您只将topic合并到master 一次,并且您知道您在合并提交E时将topic合并到了master,那么您可以简单地使用<rev>^-<n>修订语法
git log E^-

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

git when-merged topic

把所有东西放在一起:
git log $(git when-merged -c topic)^-

如果你将topic多次合并到master中,那么上面的语法只会列出在最近一次合并提交中合并的提交。在这种情况下,您可以使用rocketraman的mergedtopiclg别名
git mergedtopiclg $(git when-merged -c topic)

为了完整性,这个别名已被配置为

    mergedtopiclg = !sh -c \"git lg $(git oldest-ancestor $1^2 ${2:-master})..$1^2\" -
    # The oldest ancestor between an integration branch (by default, master) and a topic branch (by default HEAD)
    # e.g. git oldest-ancestor master ai/topic
    # See https://dev59.com/LHI_5IYBdhLWcg3wF_F3#4991675
    oldest-ancestor = !bash -c 'diff --old-line-format= --new-line-format= <(git rev-list --first-parent \"${1:-master}\") <(git rev-list --first-parent \"${2:-HEAD}\") | head -1' -

4
您可以使用以下命令:
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 键更加清晰。


3
似乎这完全不起作用——它给我带来了很多额外的提交。 - singingwolfboy
@singingwolfboy,对我来说它完美地运行。你能给我提供你的输入和输出吗? - Sascha Wolf
@SaschaWolf,有没有不克隆存储库就能获得相同结果的方法? - Sungguk Lim
@SunggukLim 你具体是什么意思?你是想在远程仓库上执行此操作,例如 GitHub 上的仓库吗? - Sascha Wolf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接