在PowerShell中让git mergetool自动选择(m)odified解决合并冲突
我懂你这种烦躁——手动逐个确认每个冲突文件,尤其是碰到那种「本地删除/远端修改」的冲突提示时,反复输入m真的太磨人了。之前用Echo m | git mergetool只搞定第一个文件,是因为管道只传了一次输入,而git mergetool每处理一个冲突都会重新索要输入,所以得让PowerShell持续输出m直到命令跑完。
下面给你两个靠谱的解决方案:
方案一:用PowerShell持续生成输入
你可以用PowerShell的while循环不断输出m,通过管道传给git mergetool,这样每个冲突提示都会自动收到m的选择:
while($true) { Write-Output 'm'; Start-Sleep -Milliseconds 100 } | git mergetool
这个脚本会一直输出m,每次间隔100毫秒(防止输出太快Git处理不过来),直到git mergetool处理完所有冲突。等它跑完你按Ctrl+C终止循环就行,或者管道会在git mergetool退出后自动关闭。
方案二:配置Git使用自动选择Modified的合并工具
如果你不想每次都敲循环脚本,可以自定义一个简单的合并工具脚本,让Git自动帮你选modified版本:
- 先创建一个PowerShell脚本,比如
auto-choose-modified.ps1,内容如下:
param($base, $local, $remote, $merged) # 判断哪个版本是modified的:本地文件存在就用local,否则用remote if (Test-Path $local) { Copy-Item $local $merged } else { Copy-Item $remote $merged } exit 0
这个脚本会检查本地版本是否存在(如果是「本地删除/远端修改」的场景,本地文件会不存在),然后把存在的modified版本复制到合并后的文件里。
- 接着在Git里配置这个自定义工具:
git config --global mergetool.autochoose.cmd 'powershell -ExecutionPolicy Bypass -File "C:\实际路径\auto-choose-modified.ps1" $BASE $LOCAL $REMOTE $MERGED' git config --global mergetool.autochoose.trustExitCode true
记得把C:\实际路径\auto-choose-modified.ps1换成你脚本的真实路径。
- 之后处理冲突时直接用这个工具就行:
git mergetool --tool=autochoose
这样Git会自动处理所有冲突,完全不需要交互,直接选择modified版本。
补充说明
对于那种「Deleted merge conflict for 'xxx': {local}: deleted {remote}: modified file」的提示,方案一的循环输入m也能自动搞定,因为Git的提示里m对应的就是保留修改后的文件,不管这个版本来自本地还是远端。
内容的提问来源于stack exchange,提问作者dajo

