git merge-base A B 可定位两分支最近共同祖先提交(即逻辑分叉点),其作者时间最接近真实分叉时刻;需配合 git show -s --format="%ci" 获取该提交时间,reflog虽记录分支创建动作但仅限本地且易过期。

git merge-base 能定位分叉点,但不直接显示时间
Git 本身不记录“分支从哪一刻开始分叉”这个语义事件,它只保存提交对象及其父提交关系。git merge-base A B 返回的是两个分支最近的共同祖先提交(即逻辑上的分叉起点),但这个提交的时间是它**被创建的时间**,不是“分支从此处分开”的操作时间——因为分支指针移动本身不产生新提交。
所以真正要查的,其实是:「共同祖先提交的提交时间」,这通常就是最接近你所谓“分叉时间点”的可靠依据。
- 运行
git merge-base main feature得到 commit hash(比如abc1234) - 再用
git show -s --format="%ci" abc1234查该提交的作者时间(ISO 8601 格式) - 或更简洁地连写:
git show -s --format="%ci" $(git merge-base main feature)
为什么 git log --oneline main...feature 不适合查分叉时间
git log main...feature 显示的是“在 feature 有、main 没有”的提交,也就是分叉后 feature 上新增的部分。它不包含共同祖先,也不能反推分叉发生时刻——尤其当两个分支都往前推进过,这个范围可能很大,且起始提交时间远晚于实际分叉点。
- 它反映的是「差异内容」,不是「分叉位置」
- 如果 feature 分支创建后很久才第一次提交,
git log main...feature的最早提交时间会严重滞后于真实分叉时间 - 想看分叉点附近的上下文,应该用
git log -n 3 --decorate $(git merge-base main feature)
注意 reflog 可能提供更准的“分支创建时间”,但仅限本地
如果你关心的是“这个分支指针是何时被创建出来的”(比如 git checkout -b feature 或 git branch feature 的时刻),那 Git 的 reflog 里有记录,但只存在本地仓库,且默认 90 天后自动清理。
- 查 feature 分支创建动作:
git reflog | grep "feature@{0}"(注意匹配 reflog 索引和分支名) - 更精准一点:
git reflog show --date=iso feature | head -n 1 - 但注意:reflog 记录的是“引用更新时间”,如果分支是从某个旧提交检出的,这个时间仍可能比共同祖先提交晚很多
别依赖 git branch --contains 或 --merged 来推断分叉时间
git branch --contains <commit> 或 --merged 是用于判断归属关系的,它们返回分支列表,不带时间信息。强行结合 git log 去扫每个分支的 tip 时间,既慢又不可靠——分支 tip 可能早已被 force-push 覆盖或重置。
真正稳定可复现的锚点只有共同祖先提交本身。它的 committer date 和 author date 虽然不能 100% 等同“分叉发生时刻”,但在所有 Git 命令能给出的答案里,这是唯一有明确含义、跨仓库一致、且无需依赖本地 reflog 的选项。


















