Weave:基于代码结构理解的智能合并工具
Weave 是一款旨在解决 Git 在合并代码时产生的冲突的工具,尤其是在多个 AI 代理协同开发同一个代码库时。它通过理解代码结构来解决 Git 无法解决的合并冲突,从而减少人工干预。
问题:
Git 采用基于行的合并方式。当两个分支对同一文件的不同函数进行修改时,Git 会将它们识别为冲突,即使这些修改是完全独立的。这种现象在多个 AI 代理同时修改同一代码库时尤为常见,导致开发者需要手动解决虚假的冲突。
Weave 的解决方案:
Weave 采用基于实体级别的合并,而不是基于行的合并。其工作流程如下:
- 解析代码: 使用 tree-sitter 将三个版本(基础版本、我们的版本、他们的版本)解析成语义实体,例如函数、类、JSON 键等。
- 匹配实体: 通过名称、类型和作用域等唯一标识符匹配不同版本之间的实体。
- 实体级别合并:
- 不同实体修改: 自动解决,无冲突。
- 同一实体修改: 尝试进行实体内部的合并,只有在修改不兼容时才会产生冲突。
- 一方修改,另一方删除: 标记为有意义的冲突。
实际效果:
Weave 通过避免对独立修改产生冲突,显著减少了人工干预的需求。
| 场景 |
Git (基于行) |
Weave (基于实体) |
| 两个代理添加不同的函数到同一文件 |
冲突 |
自动解决 |
| 代理A修改foo(),代理B添加bar() |
冲突 |
自动解决 |
| 双方都修改了同一个函数 |
冲突 |
冲突(带有实体上下文) |
| 代理修改,另一方删除同一个函数 |
冲突 |
冲突:函数'validateToken' (我们的版本修改,他们的版本删除) |
| 双方添加了完全相同的函数 |
冲突 |
自动解决 |
| 不同 JSON 键被修改 |
冲突 |
自动解决 |
基准测试:
在多个主流开源代码库的合并提交上进行了测试,结果表明:
- 胜率: 解决 Git 产生冲突但 Weave 能够自动解决的场景。
- 回归: Weave 引入错误的场景(均为零)。
- 人类匹配: Weave 的输出与人工编写的结果匹配的程度。
- 解决率: Weave 成功解决的合并提交比例。
冲突标记:
当发生真正的冲突时,Weave 提供更丰富的上下文信息:
<<<<<<< ours — function `process` (both modified)
export function process(data: any) {
return JSON.stringify(data);
}
=======
export function process(data: any) {
return data.toUpperCase();
}
>>>>>>> theirs — function `process` (both modified)
开发者可以立即知道冲突的实体、类型以及冲突原因。
支持的语言:
TypeScript, JavaScript, Python, Go, Rust, JSON, YAML, TOML, Markdown。对于不支持的文件类型,将退回到标准的基于行的合并。
安装与配置:
Weave 提供命令行工具和 Git 驱动,方便安装和配置。
架构:
Weave 包含以下核心组件:
- weave-core: 实体提取、三方合并算法和代码重建的核心库。
- weave-driver: Git 合并驱动程序,由 Git 调用。
- weave-cli: 命令行工具,用于配置和预览合并。
工作原理:
Weave 通过解析、提取、匹配、合并和重建等步骤,实现高效的实体级别代码合并。