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

多合并基准下无需执行合并即可预览实际合并新增变更

问题:无需合并即可查看分支的实际合并变更

场景说明

当前处于main分支的commit F,想要查看topic-2分支合并到main后的实际变更。提交历史如下:
提交历史图
可通过下方脚本生成该提交历史,每个非合并提交会新增一个空文件,便于区分各提交的变更。

遇到的问题

实际只有commit D尚未合并到main,但执行git diff --stat ...topic-2命令却显示了2处变更:

warning: HEAD...topic-2: multiple merge bases, using 1651defc16ef2a5c0129ee3806dca7881f138407
 C | 0
 D | 0
 2 files changed, 0 insertions(+), 0 deletions(-)

为简洁起见使用了--stat参数,实际需要完整的diff内容。

原因分析

git diff找到2个可用于对比topic-2的合并基准,最终选择了commit B。对比commit B和E会显示C和D的变更,但将topic-2合并到main后,查看合并提交会发现实际仅commit D的变更被添加到main:

commit f0f9fba1c262017f9cc1ffa213d211529d9a7351 (HEAD -> main, tag: G)
Merge: b95f9e8 2d97842
Author: [...]
Date:   2023-07-20 11:46:38 +0200

    Merge branch 'topic-2'

 D | 0
 1 file changed, 0 insertions(+), 0 deletions(-)

核心问题

是否存在无需执行合并即可生成该变更列表(即本例中仅显示D的变更)的方法?

已知可以先将main的当前状态合并到topic-2再执行git diff,但希望跳过该步骤。也清楚这类diff并非总能通过机械方式生成,因为合并操作可能产生冲突,但希望在95%无冲突的场景下,能通过CLI一步获取该diff。


用于复现的脚本

rm -rf foo
git init foo

change() { touch $1; git add -A; git commit -q -m $1; git tag $1; }
merge() { git merge -q --no-ff $1; git tag $2; }

(
    cd foo
    change A

    git checkout -b topic-1 main
    change B

    git checkout main
    change C

    git checkout -b topic-2 main
    change D
    merge topic-1 E

    git checkout main
    merge topic-1 F

    echo '====='
    git --no-pager diff --stat ...topic-2
    echo '====='

    merge topic-2 G
    echo '====='
    git --no-pager show --stat
    echo '====='
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 16:07:11