给定 master 分支历史中的提交 X,我想确定该提交包含到 master 中的 merge 。换句话说,我想找到最大的 i 使得 X 是 master~i
的祖先,即 i 第一个父链上 master 的第 th 个祖先。 (这假设 merge 到 master 将以前的 master 作为第一个父级,这通常是 afaik 的情况。)这如何有效地完成?
例子
举个例子,假设我有以下历史:
A - B - C - D - E - F - G - H
\ \ / /
I -[J]- K - L - M
\ /
N - O - P
当我想知道什么时候 J
git merge 到 master 时(上行),我希望命令返回 F
。因为从 H
开始,只有第一个父级的历史是 H - G - F - E - …
并且 J
是 的祖先F
但不是 E
的祖先。只是在 J..H
范围内寻找最近的 merge 是不够的,因为我不想找到 K
或 L
。由于 L
是 F
的第二个父级,因此这两个都不是 H
的仅第一父级历史的一部分。
最佳答案
怎么样:
git log --oneline --merges -1 [<rev range>]
这将列出当前分支的第一个 merge 提交,或者如果您将其作为 rev 范围,则从提交 X 开始。评论git help log
变甜并上 table 。
更新以关注已澄清的问题
额外的技术是使用
git merge-base --is-ancestor <commit> <commit>
这将根据祖先返回 true/false(例如 https://stackoverflow.com/a/13526591/717355)。
所以首先在 master 上生成你的第一个父 merge 列表,或者排除相关提交可以到达的提交,或者使用日期和 --since=<commiter_date>
选项。然后对于每个顺序(通常是最旧的),检查您的提交是否是给定 merge 提交的祖先。您可以使用以下 bash 脚本:
for merge in $(git rev-list --reverse --first-parent --merges "${commit}"..master)
do if git merge-base --is-ancestor "${commit}" "${merge}"
then git show -s "${merge}"
break
fi
done
关于git - 识别 merge 到master,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39144006/