Git Windows已设merge.commit=no,合并时为何仍自动提交?
git merge自动提交的问题 咱们一步步拆解可能的原因,逐个验证解决:
1. 快进合并(Fast-Forward)导致的“假自动提交”
这是最常见的诱因。当你要合并的feature-branch-name是当前分支的直接上游(比如feature分支从当前分支拉出后,当前分支没有新增任何提交),Git默认会执行快进合并——它不会创建新的合并提交,只是直接把当前分支的HEAD指针移动到feature分支的最新提交上。这种场景下,merge.commit=no的配置完全不会生效,因为全程没有触发“提交”操作,你看到的分支变更看起来像自动提交,但本质只是指针移动。
验证方法:
执行合并时加上--no-ff强制创建合并提交:
git merge --no-ff feature-branch-name
如果这次合并后没有自动提交,而是停留在待提交状态,那问题就出在快进合并上。
解决办法:
如果你想让所有合并都强制生成合并提交(无论是否能快进),可以设置全局配置:
git config --global merge.ff no
之后执行git merge时,Git会默认创建合并提交,并且遵循merge.commit=no的配置,不再自动提交。
2. Git Merge的别名覆盖了配置
有可能你给git merge设置了别名,偷偷带上了--commit参数,导致配置被覆盖。
验证方法:
执行以下命令查看所有Git别名:
git config --get-regexp alias
如果输出里有类似alias.merge=merge --commit或者包含--commit的配置,那就是别名在搞鬼。
解决办法:
删除这个别名即可:
git config --unset alias.merge
或者修改别名,去掉--commit参数。
3. 局部仓库配置的二次确认(概率较低)
虽然你执行git config --list看到三次merge.commit=no,但可以再确认下局部仓库的配置文件(.git/config)里的对应值,确保没有被意外覆盖:
cat .git/config | grep -A2 -B2 merge.commit
如果显示merge.commit=no,这个点就可以排除。
补充说明
你使用的Git版本2.25.1.windows.1中,merge.commit=no配置是生效的,但它只在非快进合并且无冲突的场景下起作用。如果合并有冲突,Git本来就不会自动提交,会要求你解决冲突后手动提交。
另外GitExtensions表现正常,大概率是因为它默认执行非快进合并,或者合并时明确指定了--no-commit,所以不受快进合并的影响。
内容的提问来源于stack exchange,提问作者Craig

