多合并基准下无需执行合并即可预览实际合并新增变更
问题:无需合并即可查看分支的实际合并变更
场景说明
当前处于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
相关产品推荐
相关产品推荐

