合并Git提交时如何在提交信息中包含各提交的变更文件列表
Git合并提交时保留子提交文件变更关联的解决方法
半自动方案:手动整理提交信息
执行交互式变基合并提交前,先导出所有待合并提交的信息和对应文件:
git log --oneline --name-only HEAD~[N]..HEAD
(把[N]替换成你要合并的提交数量)
这个命令会输出类似如下的内容:
abc123 Removed xyz property A B C def456 Removed tuv property B C D
接着执行git rebase -i HEAD~[N],把除第一个提交外的pick改成squash,保存退出后进入提交信息编辑界面,把上面导出的内容整理成结构化格式:
feat: 完成属性移除相关任务 - Removed xyz property - A、B、C - Removed tuv property - B、C、D
既完成了提交合并,又清晰保留了每个动作对应的文件范围。
全自动方案:用Git钩子自动生成提交信息
可以通过prepare-commit-msg钩子,在合并提交时自动生成符合要求的结构化提交信息:
- 进入项目的
.git/hooks/目录,创建prepare-commit-msg文件(如果已有带.sample后缀的同名文件,直接重命名去掉后缀即可) - 写入脚本逻辑,判断当前是否为squash合并操作,若是则遍历所有被合并的提交,提取提交信息和对应变更文件,整理成目标格式后写入提交信息文件。
示例核心脚本逻辑:
if [ "$2" = "squash" ]; then # 获取所有被合并的提交哈希 commits=$(git log --reverse --pretty=%H HEAD~$(git rev-list --count HEAD~1..HEAD)) msg_content="" for commit in $commits; do # 提取提交描述 commit_msg=$(git log --pretty=%B -n1 $commit) # 提取变更文件列表并格式化 files=$(git show --name-only --pretty=format:'' $commit | tr '\n' '、') # 拼接结构化内容 msg_content="$msg_content\n- $commit_msg\n - $files" done # 将内容写入提交信息文件 echo "feat: 合并属性移除相关任务" > "$1" echo -e "$msg_content" >> "$1" fi
最后给文件添加执行权限:chmod +x .git/hooks/prepare-commit-msg,之后每次squash合并时都会自动生成符合要求的提交信息。
是否应该放弃合并提交?
如果团队允许主分支保留细粒度提交,且你需要频繁追溯单个小任务的完整diff,那可以选择不合并。但从你的需求来看,合并提交更适合:既保持主分支日志简洁,又能通过结构化的提交信息明确每个变更动作对应的文件范围,完全满足后续区分“哪些文件移除了xyz属性”的需求。
内容的提问来源于stack exchange,提问作者davidalayachew
相关产品推荐
相关产品推荐

