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

合并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钩子,在合并提交时自动生成符合要求的结构化提交信息:

  1. 进入项目的.git/hooks/目录,创建prepare-commit-msg文件(如果已有带.sample后缀的同名文件,直接重命名去掉后缀即可)
  2. 写入脚本逻辑,判断当前是否为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 21:05:02