Git:如何列出此分支上的提交记录,但不包括合并分支的提交记录

113

假设你的 Git 提交历史看起来像这样:

A---B---C---D---E---F master
     \         /
      X---Y---Z topic

是否可以让Git仅列出主分支上的提交记录A-F?换句话说,如果提交记录在合并的分支上,我不想看到它。


2
那么,Git 如何知道 DZ 中哪一个是合并分支的一部分呢? - Romain
2
当从主分支合并时,之前的主分支提交将是合并的第一个父提交。 git log 可以通过使用 --first-parent 选项只显示这些提交,因此您可以得到正确的内容。 - CharlesB
可能是重复的问题:如何运行Git Log仅查看特定分支的更改? - Steve Chambers
4个回答

156

git log 带有选项 --first-parent,因此您将不会获取 topic 的历史记录。

当从 master 合并时,master 提交是合并的第一个父提交。Git log 允许仅显示那些带有 --first-parent 选项的提交,这样您就可以得到正确的内容。


30
+1 --first-parent 就可以了 :) 再加上 --no-merges 就能隐藏合并提交。 - c00kiemon5ter
如何退出长列表? - Rui Monteiro
@RuiMonteiro 按Q键 - Silis Alin

26
TLDR: git log origin/master --no-merges将给出主分支的日志并排除任何合并提交(在此例中为x, y, z)。
原始要点:
有另一种通用方法可以处理此问题,不依赖于--first-parent,在某些情况下很有帮助..使用分支排除过滤器。 git log origin/topic ^origin/master这将为您提供一个以origin/master的提交为基础来显示origin/topic的日志。
您还可以添加--no-merges,它将隐藏合并提交,这可能是您需要的也可能不是。
另一个方便的提示是使用shortlog而不是log,它会给您更多缩略汇总信息,对于发布说明或分支内容的通信非常有用。
更新 重新阅读后,实际上您想要的几乎是我发布的相反内容;但是它将排除所有在主分支和foo分支上的提交(git log origin/master ^origin/foo)。但是,您也可以通过git log origin/master --no-merges获得您所需的内容(隐藏属于合并的所有提交)。

0

查尔斯的答案对我有用。

git log has option --first-parent --no-merges, so you won't get topic history.

但是,如果您在Git活动中使用任何图形用户界面,例如Git Extension、SourceTree、Tortoise Git等,

那么您的工具中将有直接选项来检查第一个父级。我想把这个答案添加到列表中,因为大多数人发现图形界面很容易使用。如果需要,您可以直接从工具中挑选特定分支的所有提交。

我附上了两个工具的示例,其他工具也应该类似:[我已模糊化用户名、git仓库名称,因为这是私有仓库,但您仍然可以了解如何从工具中使用第一个父级]

  1. Git Extension
    • 打开Git Extension->选择要查看提交的功能分支,有一个选项可以选择第一个提交,如下图所示:

enter image description here

2. Tortoise Git
  • 打开存储库文件夹 -> 点击Tortoise Git中的显示日志 -> 检出分支并选择第一个提交,如图所示

enter image description here


-4

这个不起作用吗?

git log master
git log --stat master

不行,那些方法都不可行。合并提交有两个父节点;从这两个父节点追溯的所有内容都在“master”分支上。 - GoZoner

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