确定合并为主

时间:2016-08-25 11:26:29

标签: git version-control merge

如果在主分支的历史记录中提交 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 - …,而JF的祖先,但不是E的祖先。只是在J..H范围内寻找最近的合并将不够好,因为我不想找到KL。由于HL的第二个父级,因此这两个都不属于F的第一个父级历史记录的一部分。

1 个答案:

答案 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