Git合并不同行修改触发冲突如何自动生成预期合并结果
解决方案
你可以通过自定义Git合并驱动实现自动合并这类占位行修改的场景,具体操作步骤如下:
方案一:自定义合并驱动(长期适配同类场景)
步骤1:编写合并逻辑脚本
创建名为git-merge-placeholder的可执行脚本,逻辑为按占位行位置优先取两个分支的修改值:
#!/bin/bash # 参数含义:%O=base版本(master原始内容) %A=当前分支版本 %B=待合并分支版本 BASE=$1 OURS=$2 THEIRS=$3 # 临时存储输出内容 > "$OURS.tmp" # 按行遍历base的每一个占位位置 paste "$BASE" "$OURS" "$THEIRS" | while IFS=$'\t' read -r base_line our_line their_line; do if [ "$our_line" != "$base_line" ]; then # 当前分支修改了该占位,优先用当前分支的值 echo "$our_line" >> "$OURS.tmp" elif [ "$their_line" != "$base_line" ]; then # 待合并分支修改了该占位,用待合并分支的值 echo "$their_line" >> "$OURS.tmp" else # 都没修改,保留原始占位 echo "$base_line" >> "$OURS.tmp" fi done # 替换当前分支的文件内容 mv "$OURS.tmp" "$OURS" exit 0
将脚本放到系统PATH路径下,添加可执行权限:chmod +x git-merge-placeholder
步骤2:配置Git合并驱动
执行以下命令注册合并驱动:
git config merge.placeholder-merge.name "占位行自动合并驱动" git config merge.placeholder-merge.driver "git-merge-placeholder %O %A %B"
步骤3:指定适配文件
在仓库根目录创建.gitattributes文件,指定对应文件使用该合并驱动:
file.txt merge=placeholder-merge
配置完成后再执行合并操作,就会自动生成A\nB的预期内容,不会触发冲突。
方案二:冲突后自动处理(适合单次脚本集成)
如果不想修改Git配置,也可以在合并脚本中加入冲突自动处理逻辑,修改你的合并步骤如下:
# 合并a分支 git merge --no-ff "a" -m "Merge A" # 合并b分支,禁止自动提交,出现冲突不中断 git merge --no-ff --no-commit --no-abort "b" || true # 自动处理冲突内容 grep -v -E '^(<<<<<<<|=======|>>>>>>>|UNUSED_)' file.txt > file.txt.tmp mv file.txt.tmp file.txt # 提交合并结果 git add file.txt git commit -m "Merge B"
该逻辑会自动过滤冲突标记和未修改的占位行,直接生成预期合并结果。
内容的提问来源于stack exchange,提问作者Filipe Rodrigues
相关产品推荐
相关产品推荐

