自定义合并驱动 union 是什么
union 驱动把合并双方的改动都保留(取并集),适合变更日志、作者名单等「累加式」文本:在 .gitattributes 里对目标文件配置 merge=union 后,这类文件不再产生人工冲突。它只保证不冲突,不保证顺序与语义正确,用错地方会产出坏数据。
基本信息
| 用途 | 双方改动取并集,无需人工解决冲突 |
|---|---|
| 配置 | .gitattributes 中写 <模式> merge=union |
| 典型文件 | CHANGELOG、AUTHORS、名单类文本 |
| 验证 | git check-attr merge -- CHANGELOG.md |
| 生效范围 | 属性随仓库分发,所有克隆方均生效 |
| 局限 | 不理解语义,重复行与顺序问题都会保留 |
典型使用场景
- 变更日志:多个分支各加一节,合并时自动保留双方记录。
- 作者名单:新贡献者追加互不冲突,减少无意义的解冲突。
- 白名单与清单:天然追加型文件,重复行可由脚本去重。
- 多分支并行调研:交替编辑同一列表时避免手工合并。
- 自动化流程:机器人提交的追加型文件用 union 降低冲突率。
- 文档草稿:多人同时往同一节追加意见时先自动保留,再由编辑整理。
- 模板类文件:双方各加段落的场景可用(仍需事后整理顺序)。
配置示例
配置示例
printf 'CHANGELOG.md merge=union
AUTHORS merge=union
' >> .gitattributes
# 写入属性后提交,让规则随仓库分发
git check-attr merge -- CHANGELOG.md # 校验属性是否生效
git merge feature-a # 合并时目标文件取并集
# 合并后仍要检查重复行与顺序是否符合阅读习惯合并方式对照
| 方式 | 行为 | 适用 |
|---|---|---|
| 普通合并 | 冲突则停下等人工处理 | 一般源码文件 |
| merge=union | 双方改动全部保留 | 追加型文本 |
| merge=ours | 忽略一侧保留一侧 | 锁定文件与生成物 |
| 自定义驱动 | 按脚本逻辑决定结果 | 结构化格式的特殊处理 |
union 只保证「不冲突」,不保证顺序与语义正确;用于有序或去重敏感文件(如 JSON/YAML)会产出坏数据,仅限天然追加型文本。