You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否让git log将从master合并的变更折叠为更少行数?

问题

我参与的项目有数百名贡献者每日提交代码。在开发特性分支cshroba/my-feature-branch时,我会频繁将master分支合并进来,但使用git log --graph或git log --graph --oneline查看日志时,会显示大量master分支的提交,之后才展示我的分支变更,示例如下:

*   f93e1e0f107 (HEAD -> cshroba/my-feature-branch, origin/cshroba/my-feature-branch) Merge branch 'master' into cshroba/my-feature-branch
|
| * 3029c915d02 (origin/master, origin/HEAD, master) someone else's commit
| * 9f08e615205 someone else's commit
| * 7722734920e someone else's commit
| * 4eb08b2342d someone else's commit
| * 15f5521b2c8 someone else's commit
| * e4386c33ffd someone else's commit
| * b03a944e2e8 someone else's commit
| * 2a84cd2a005 someone else's commit
| * 68a1f6eedd1 someone else's commit
| * 3eb35aa1ae1 someone else's commit
| * 1b01a894ee6 someone else's commit
| * 146c3f63eaf someone else's commit
| * e47660b4b21 someone else's commit
| * 834f628c723 someone else's commit
| * 3e6cff1c109 someone else's commit
| * 67468c547cf someone else's commit
| * dcb38ce901b someone else's commit (assume there are hundreds more that I'm omitting here)
| * 7722734920e someone else's commit
* | 61cf1c2c5a1 My change from my branch
* | 8e052ed090e My change from my branch
* | 94159085e8f My change from my branch
* | 25935b173ad My change from my branch
* | fdfb73c2877 My change from my branch
* | 90294f975eb My change from my branch
* | b69ed8b8ba2 My change from my branch
* | 1fd4f2dc1e6 My change from my branch
* | c048b4a6b93 My change from my branch
* | 4567a677d9e My change from my branch
|/  
* c8301756fd2 The change from master that I initially branched off

我不关心master分支的具体变更,希望能将这些提交折叠为一行或几行,比如这样的效果:

*   f93e1e0f107 (HEAD -> cshroba/my-feature-branch, origin/cshroba/my-feature-branch) Merge branch 'master' into cshroba/my-feature-branch
|
| * 3029c915d02 (origin/master, origin/HEAD, master) someone else's commit
| *             < 812 commits (hidden) >
| * 7722734920e someone else's commit
* | 61cf1c2c5a1 My change from my branch
* | 8e052ed090e My change from my branch
* | 94159085e8f My change from my branch
* | 25935b173ad My change from my branch
* | fdfb73c2877 My change from my branch
* | 90294f975eb My change from my branch
* | b69ed8b8ba2 My change from my branch
* | 1fd4f2dc1e6 My change from my branch
* | c048b4a6b93 My change from my branch
* | 4567a677d9e My change from my branch
|/  
* c8301756fd2 The change from master that I initially branched off

解决办法

1. 用--first-parent简化日志(最直接)

这个参数让Git只追踪当前分支的直接父提交,跳过合并进来的master分支历史,只显示你的特性分支提交和合并节点。执行命令:

git log --graph --oneline --first-parent cshroba/my-feature-branch

效果:日志里只会展示你分支上的所有变更,以及每次合并master的节点,不会展开master上的其他提交。

2. 自定义折叠显示(接近示例效果)

如果想要保留master分支的首尾提交并折叠中间部分,可以通过脚本辅助实现:

  1. 先找到特性分支和master的分叉点:
MERGE_BASE=$(git merge-base cshroba/my-feature-branch master)
  1. 计算master从分叉点到当前的提交数:
COMMIT_COUNT=$(git rev-list --count $MERGE_BASE..master)
  1. 结合git log的自定义格式,用脚本生成带折叠标记的日志(示例脚本框架):
git log --graph --oneline cshroba/my-feature-branch | awk -v count="$COMMIT_COUNT" '
    /\| \* / && !seen_master_start {
        print $0;
        seen_master_start=1;
        printf "| *             < %d commits (hidden) >\n", count-2;
        skip=1;
    }
    skip && /\| \* / { next }
    skip && !/\| \* / { skip=0; print $0 }
    !seen_master_start { print $0 }
'

这个脚本会在master分支的第一个提交后插入折叠标记,跳过中间所有提交,直到回到特性分支的提交记录。

3. 用--simplify-by-decoration过滤重要节点

这个参数只显示带有分支、标签等标记的提交,能大幅减少无关日志:

git log --graph --oneline --simplify-by-decoration cshroba/my-feature-branch master

效果:日志里只会展示master分支头、特性分支头、合并节点以及有标签的关键提交,自动隐藏中间的普通提交。


内容的提问来源于stack exchange,提问作者Christopher Shroba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 10:31:12