如何提取已合并到主分支的特性分支的修改文件列表?
解决合并后获取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
相关产品推荐
相关产品推荐

