Git如何手动设置索引文件非零阶段值标记merge-file合并冲突
解决方案
首先修正原有脚本的拼写小笔误(orignal.base应为original.base),并补充冲突场景下的索引阶段设置逻辑,完整实现如下:
完整脚本实现
你需要提前备份合并前的derived文件,用于后续阶段3的条目生成,完整脚本示例:
#!/bin/bash # 提前备份原始derived文件 cp derived derived.bak # 导出基准版本 git cat-file -p HEAD:original > original.base # 执行三方合并 git merge-file derived original.base original # 判断是否发生冲突 if [ $? -ne 0 ]; then # 1. 将三个版本写入Git对象库,获取blob哈希 HASH1=$(git hash-object -w original.base) # 阶段1:基准版本 HASH2=$(git hash-object -w original) # 阶段2:我方修改(original的变更) HASH3=$(git hash-object -w derived.bak) # 阶段3:对方版本(合并前的derived) # 2. 移除索引中原有的derived的0阶段条目 git update-index --remove derived # 3. 写入三个阶段的冲突条目到索引 git update-index --index-info <<EOF 100644 $HASH1 1 derived 100644 $HASH2 2 derived 100644 $HASH3 3 derived EOF echo "合并冲突:derived 存在未解决冲突,请处理后提交" else echo "变更已成功同步到derived" fi # 清理临时文件 rm -f original.base derived.bak
实现效果说明
执行上述脚本发生冲突后:
- 执行
git status会直接显示both modified: derived,和普通合并冲突的展示完全一致 - 未解决冲突时执行
git commit会直接报错,阻止提交 - 可以直接调用
git mergetool打开GUI工具解决冲突,冲突标记的对应关系符合常规合并逻辑:<<<<<<< derived对应合并前的derived内容=======分隔后对应original的变更内容>>>>>>> original
- 冲突解决后执行
git add derived会自动清除三个阶段的冲突条目,恢复为正常的0阶段状态。
原理说明
git update-index的--index-info参数支持按标准索引格式批量写入条目,只要格式符合<模式> <哈希> <阶段> <文件名>的规范,就可以直接创建多阶段的冲突索引条目,不需要依赖树对象操作。
内容的提问来源于stack exchange,提问作者Azegor
相关产品推荐
相关产品推荐

