Git如何自动合并同一文件中的非冲突并行变更?
解决Git并行更新JSON文件的冲突问题
问题原因
虽然两个组件修改的是versions.json的不同节点,但Git默认合并策略可能因JSON格式的换行、逗号等细节识别为冲突,再加上CI流水线并行执行的竞争条件,容易出现rebase失败的情况。
自动化解决方案
1. 自定义JSON合并驱动(最可靠)
利用jq工具专门处理JSON文件的合并,让Git自动解决冲突:
- 在仓库根目录创建
.gitattributes文件,添加规则:versions.json merge=json-merge - 配置Git的合并驱动(CI环境需提前安装jq):
这个驱动会将本地版本(git config merge.json-merge.driver 'jq -s ".[0] * .[1]" %A %B > %A'%A)和远程版本(%B)的JSON对象合并,完整保留双方对不同节点的修改,无需人工干预。
2. 带合并策略的Rebase命令
在执行rebase时指定合并策略选项,强制Git自动合并非重叠的修改:
将CI流程中的git pull --rebase替换为:
git pull --rebase -X theirs
-X theirs参数会让Git在遇到冲突时,自动结合远程分支的修改与本地的非重叠修改,适配不同组件修改不同节点的场景。
3. 循环重试+自动冲突解决
针对竞争条件导致的偶发失败,用脚本循环执行rebase和push,失败时自动合并冲突:
#!/bin/bash set -e # 先完成修改文件、提交变更的步骤... # 循环尝试rebase和push while true; do if git pull --rebase; then git push break else # 用jq自动合并冲突的JSON文件 jq -s ".[0] * .[1]" versions.json .git/rebase-apply/versions.json > versions.json git add versions.json git rebase --continue fi done
这个脚本会在rebase失败时自动合并本地与远程的JSON修改,继续rebase流程,直到push成功。
内容的提问来源于stack exchange,提问作者jaw
相关产品推荐
相关产品推荐

