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

如何提取已合并到主分支的特性分支的修改文件列表?

解决合并后获取Git特性分支修改文件列表的问题

当特性分支(feature_branch)已经合并到主分支(master_branch)后,master_branch..feature_branch这种范围查询会返回空,因为feature分支的所有提交已经被包含进master分支。以下是几种可靠的解决方法:

方法1:基于共同祖先对比(最通用)

通过git merge-base找到两个分支的共同祖先节点,再对比该节点与feature分支的文件差异,就能得到feature分支从分叉开始所有修改的文件:

git diff --name-only $(git merge-base master_branch feature_branch) feature_branch

方法2:针对合并提交对比

如果知道合并master和feature的提交哈希(可通过git log --oneline --merges找到),直接对比该合并提交的两个父节点(1对应master分支的父,2对应feature分支的父):

git diff --name-only <MERGE_COMMIT_HASH>^1 <MERGE_COMMIT_HASH>^2

方法3:用git log的三点范围查询

三点范围master_branch...feature_branch会展示两个分支中独有的提交,配合--name-only也能提取文件,合并后feature分支无新提交时,结果与方法1一致:

git log --name-only --pretty=format: master_branch...feature_branch

Python脚本中的实现建议

避免使用os.system(),因为它无法直接捕获命令输出,推荐用subprocess模块处理:

import subprocess

def get_feature_modified_files(master_branch, feature_branch):
    # 获取master和feature的共同祖先哈希
    merge_base = subprocess.check_output(
        ["git", "merge-base", master_branch, feature_branch],
        encoding="utf-8"
    ).strip()
    # 提取差异文件列表
    diff_output = subprocess.check_output(
        ["git", "diff", "--name-only", merge_base, feature_branch],
        encoding="utf-8"
    )
    # 过滤空行并返回列表
    return [file.strip() for file in diff_output.splitlines() if file.strip()]

# 使用示例
modified_files = get_feature_modified_files("master", "my-feature")
for file in modified_files:
    print(file)

为什么之前的命令无效?

  • git log --name-only --pretty=format: <feature_branch>:会列出feature分支的完整历史,包括从master继承的所有提交,因此包含大量无关文件。
  • master_branch..feature_branch:该语法仅展示master中没有但feature中有的提交,合并后feature的所有提交已同步到master,因此返回空。

内容的提问来源于stack exchange,提问作者Alberto-HdF

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 03:55:16