merge-base 是什么
git merge-base 计算两个或多个提交的合并基础,也就是它们共同的最近祖先,通俗说就是「分叉点」。它是理解三方合并的关键:冲突标记里那一版 base 内容,正是由共同祖先提供的。日常排查中它常被用来确认分支从哪里分开、构造 rebase --onto 的搬移范围,或用 --is-ancestor 判断某个提交是否已经包含在另一条分支里。
基本信息
| 用途 | 求分叉点与共同祖先 |
|---|---|
| 语法 | git merge-base <A> <B> |
| 常用变体 | --is-ancestor 判断祖先关系;--fork-point 找分叉点 |
| 典型搭配 | git rebase --onto 与 diff A...B |
| 平台 | 任意 Git 客户端 |
典型使用场景
- 确认两条分支从哪个提交开始分叉
- 构造 rebase --onto 的搬移范围,避免搬错区间
- 判断某个标签或提交是否已经包含在当前分支里
- 核对三点差异的起点,理解评审视图
- 排查合并范围异常,确认是否多带了别的提交
- 给自动化脚本提供判断分叉的逻辑
常用示例
常用示例
git merge-base main feature/login # 输出共同祖先提交号
git log --oneline $(git merge-base main HEAD)..HEAD # 分叉以来的提交
git merge-base --is-ancestor v1.0 main && echo '已包含'
git merge-base --fork-point main feature常用变体
| 写法 | 作用 |
|---|---|
| merge-base A B | 输出共同祖先 |
| --is-ancestor A B | 判断 A 是否为 B 的祖先(用退出码表示) |
| --fork-point | 结合 reflog 推断分叉点 |
合并基础是理解三方合并的关键:冲突标记中的 base 版本就是它提供的共同祖先内容,弄清它有助于判断双方各自改了什么。
--is-ancestor 用退出码表达结果而非打印内容,脚本中要显式判断退出码,直接看输出会得出错误结论。
常见搭配用法
- 求分叉点后接 log 区间,看分支带来的提交
- 作为 rebase --onto 的旧基点参数,精确控制搬移范围
- 用 --is-ancestor 判断发布标签是否已包含在当前分支
- 构造三点差异时用它确定比较起点
输出为空或报错时通常是两条分支没有共同祖先(如各自从独立历史开始),此时合并需要额外参数,先确认仓库来源再处理。