如果在主分支的历史记录中提交 X ,我想识别该提交包含在master中的合并。换句话说,我想找到最大的 i ,使 X 是master~i
的祖先,即 i -th沿着第一母链的主人的祖先。 (这假设合并到master中将使用前一个master作为第一个parent,通常就是afaik。)如何有效地完成这个?
举个例子,假设我有以下历史记录:
A - B - C - D - E - F - G - H
\ \ / /
I -[J]- K - L - M
\ /
N - O - P
当我想知道J
git何时合并到主(上面一行)时,我希望命令返回F
。因为来自H
的第一个仅限父级的历史记录为H - G - F - E - …
,而J
是F
的祖先,但不是E
的祖先。只是在J..H
范围内寻找最近的合并将不够好,因为我不想找到K
或L
。由于H
是L
的第二个父级,因此这两个都不属于F
的第一个父级历史记录的一部分。
答案 0 :(得分:2)
怎么样:
git log --oneline --merges -1 [<rev range>]
这将列出当前分支的第一个合并提交,如果您将其作为rev范围,则列出提交X.查看git help log
以更加甜蜜和服务。
更新以遵循明确的问题
额外的技术是使用
git merge-base --is-ancestor <commit> <commit>
将根据祖先返回true / false(例如https://stackoverflow.com/a/13526591/717355)。
所以首先在master上生成第一个父合并列表,要么排除有问题的提交,要么使用日期和--since=<commiter_date>
选项。然后按顺序为每一个(通常是最早的),检查您的提交是否是给定合并提交的祖先。您可以使用以下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