Git:与master多次双向合并后,如何提取feature分支引入的全部变更diff
答案
可行性结论
该需求完全可实现,核心逻辑是过滤出feature分支从创建以来的独有变更,自动排除master分支侧的所有改动。
具体操作步骤
前置准备
先同步本地仓库代码到最新版本,避免基于旧提交计算出现偏差:
- 切换到master分支拉取最新代码:
git checkout master && git pull - 切换到目标feature分支拉取最新代码:
git checkout <替换为你的feature分支名> && git pull
方法一:三点diff快速生成(适配90%以上场景)
Git内置的三点diff语法专门用于提取单个分支的独有变更:
git diff master...feature > feature-only.diff
语法说明:此处为三个英文句号,和两个句号的diff有本质区别:
- 两个句号
git diff master..feature:对比两个分支最新提交的全量差异,会包含master侧的改动- 三个句号
git diff master...feature:先找到两个分支的共同祖先,再对比共同祖先到feature最新提交的差异,天然排除master后续新增的所有改动
如果多次双向合并导致默认共同祖先识别不准,可以手动指定feature从master切出的初始分叉点:
# 获取初始分叉点commit hash FORK_POINT=$(git merge-base --fork-point master feature) # 基于初始分叉点生成feature独有diff git diff $FORK_POINT feature > feature-only.diff
方法二:汇总feature独有提交改动(严格排除合并提交干扰,仅适用于未使用squash合并feature到master的场景)
如果需要彻底排除所有从master合并到feature的合并提交带来的改动,且你每次合并feature到master用的是普通合并(非squash合并),可以先筛选feature上所有独有的非合并提交,再汇总改动:
# 获取初始分叉点 FORK_POINT=$(git merge-base --fork-point master feature) # 筛选feature上所有不属于master的非合并提交,汇总生成diff git log --no-merges --format=%H $FORK_POINT..feature --not master | xargs git show > feature-only.diff
结果验证
导出diff后可抽查代码行的归属,执行git blame <对应文件名>查看行的提交记录,确认提交属于feature分支的开发提交即可。
特殊情况说明:如果双向合并过程中手动解决过冲突,冲突解决时新增/修改的代码会被识别为feature分支的改动,若这部分需要排除可在导出diff后手动过滤。
内容的提问来源于stack exchange,提问作者Ben Hershey
相关产品推荐
相关产品推荐

