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

Git合并提交中HEAD^!与HEAD^..HEAD差异及MM状态含义咨询

Git合并提交变更文件查询问题解答

1. 现象原因

git diff --name-status HEAD^!仅展示合并提交本身产生的修改(也就是合并过程中解决冲突的文件);而那些在被合并分支上新增、修改且合并时无冲突的文件,不会被该命令列出。HEAD^..HEAD则是对比合并提交的第一个父提交与合并提交本身,会展示被合并分支相对于主分支的所有变更,因此内容更完整。

2. HEAD^!的含义及与HEAD^..HEAD的差异

  • HEAD^!是Git的提交范围缩写,等价于HEAD --not HEAD^,意思是仅包含HEAD提交,排除它的第一个父提交。对于合并提交,它只呈现合并提交自身引入的修改(即冲突解决内容)。
  • HEAD^..HEAD是两点范围表示法,对比HEAD^(第一个父提交)与HEAD之间的所有变更,本质是展示从主分支到合并后状态的差异,包含被合并分支上的所有新增、修改文件,无论是否存在冲突。

3. 是否与合并提交的两个父提交相关

是的,直接相关。合并提交有两个父提交:HEAD^是执行合并时所在的分支(如主分支),HEAD^2是被合并的分支。HEAD^!仅关注合并提交与第一个父提交的差异,但只取合并提交本身的修改;若要查看合并带来的全部变更,需要对比主分支与合并后的状态,HEAD^..HEAD就实现了这个逻辑,它包含被合并分支的所有变更内容。

4. squash合并的影响及查看方式

  • 若合并前用了squash(压缩提交),合并提交会把被合并分支的多个提交压缩为一个,此时HEAD^..HEAD显示的是压缩后的所有变更;若未做squash,合并提交只是连接两个分支的历史,HEAD^..HEAD依然会展示被合并分支的所有变更,结果无差异。
  • 查看是否使用squash:执行git show HEAD,若为真正的合并提交,会显示Merge: <哈希值> <哈希值>(两个父提交);若为squash后的提交,无该行内容,仅存在一个父提交。也可以用git log --merges --oneline,squash合并不会生成带Merge标记的提交记录。

5. 输出中MM的含义

MM表示该文件在合并过程中被修改了两次:第一次是在被合并分支上修改,第二次是合并时解决冲突又做了修改。Git用双状态标记这类在合并时被两边都修改、需要手动解决冲突的文件,最终合并提交里的版本是冲突解决后的结果。

命令输出对比

# git diff --name-status HEAD^! 输出
MM      schemas/confirmation_served/model.json
MM      schemas/page_loaded/model.json
MM      schemas/review_page_loaded/model.json
# git diff --name-status HEAD^..HEAD 输出
A       schemas/confirmation_served/confirmation_served.v2.0.0.json
M       schemas/confirmation_served/model.json
A       schemas/detail.v2.0.0.json
A       schemas/page_loaded/page_loaded.v2.0.0.json
M       schemas/page_loaded/model.json
A       schemas/review_page_loaded/review_page_loaded.v2.0.0.json
M       schemas/review_page_loaded/model.json
A       schemas/transaction_detail.v3.0.0.json
A       schemas/extra_transaction_detail.v3.0.0.json
A       schemas/bill.v2.0.0.json

内容的提问来源于stack exchange,提问作者Dims

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 02:06:27