git merge-base在已合并分支上异常,无法获取正确祖先提交SHA
解决合并分支后
git merge-base返回非预期祖先的问题 我完全懂你的困扰——当branch1合并到develop之后,git merge-base develop branch1返回的是YYY而非你预期的分叉点XXX,这是因为Git的merge-base默认找的是当前两个分支的最近共同祖先。合并后develop已经包含了branch1的所有提交,所以Git会把branch1的最新提交(也就是合并到develop的那个节点YYY)判定为最近共同祖先,而非分支最初分叉时的XXX。
下面是几个能直接拿到单个分叉点提交ID的解决方案:
方案1:利用分支的合并历史直接定位
Git可以通过@{merge}引用获取分支被合并时的状态,用这个来指定合并前的branch1,就能拿到原始分叉点:
git merge-base develop branch1@{merge}
这个命令会直接返回你想要的XXX,原理是branch1@{merge}指向的是branch1被合并到develop之前的最后一个提交状态,此时和develop的共同祖先就是分叉点XXX。
方案2:从边界提交中提取单个ID
你已经知道git log --oneline --boundary develop...branch1能显示分叉点,我们可以用命令过滤出单个提交ID,不需要手动看列表:
# 方法1:用git log + grep过滤边界提交 git log --oneline --boundary develop...branch1 | grep '^-' | head -n1 | awk '{print $2}'
或者用更适合处理提交ID的git rev-list:
# 方法2:用git rev-list更高效地提取 git rev-list --boundary --reverse develop...branch1 | grep '^-' | head -n1 | sed 's/^-//'
解释下这些参数:
--boundary会在输出中标记分叉点(前缀为-)--reverse让分叉点排在输出的最前面- 最后用
sed去掉前缀的-,得到纯净的提交IDXXX
验证效果
你可以分别执行这些命令,对比返回的SHA是否和你预期的XXX一致,这些方法都能避免返回提交列表,直接拿到单个目标ID。
内容的提问来源于stack exchange,提问作者milczi
相关产品推荐
相关产品推荐

