Git提交父级顺序

13

在提交的父节点中有没有约定的顺序?因为其中一个提交的父节点应该是当前分支上正在合并的前一个提交,其余的则是来自其他合并分支的之前的提交

我想找到当前分支的前一个提交,我正在使用pygit,它返回一个提交的父节点列表,直觉上我认为父节点的顺序可能很重要,但我没有发现明确提到这一点。


我编写了这个实用函数,使用第一个父节点提交来遍历分支:

def walk_branch(pygit_repository, branch_oid):
    """
    Walk a single branch
    """
    from pygit2 import GIT_SORT_TOPOLOGICAL
    previous_first_parent_oid = None
    for commit in pygit_repository.walk(branch_oid, GIT_SORT_TOPOLOGICAL):
        if previous_first_parent_oid is None or commit.oid == previous_first_parent_oid:
            previous_first_parent_oid = commit.parents[0].oid if len(commit.parents) else None
            yield commit

3
我不知道libgit2和pygit2,但“第一个”父级总是你执行git merge时所在的分支。这是--first-parent提取的内容,并且它是从git cat-file -p somerev的原始输出中的第一个。其余的父级是“合并自”的分支。 - torek
谢谢,我不知道“第一个父级”这个术语。 - Emil Davtyan
4个回答

17

是的,如果你将A合并到B中,第一个父级就是B,第二个父级就是A。

因此,你可以这样做:gitk --first-parent 只显示当前分支的历史记录,不包括已合并的分支的详细信息。


10

libgit2及其绑定按它们在提交中存储的顺序返回父项,这是提交顺序,如通过例如git merge命令行给出的提交顺序,它是一个常数,即在创建新提交时第一个父项是当前提交(无论是通过合并还是普通的git commit)。

为了确定先前的提交(在时间上),你只需查看第一个父项。无论它们是否在同一分支中,都无法从中看到,因为提交父项可能在不同的分支中(这就是导致分支的原因),但可以绘制一条直线(就像那些git log --graph --oneline绘制的一样)。


0

除第一个父节点外,任何父节点都代表来自另一个分支的合并,至少有一个例外。

如果将一个分支合并到其自身中,通常是在两个地方单独处理后再集成,其中一个“分支”在分支中将会出现像是来自无处的情况。

如果遍历所有叶子分支的所有父节点,则会显示出这种情况,但如果遍历所有叶子分支的线性历史记录,则此类嵌套分支将不会显示出现。至少从这个意义上来说,这仍然是正确的,因为你只会遍历已合并的提交的线性历史记录。隐藏的是分支内部还有一个分支,因此它不会显示该分支专属的所有历史记录。

我不知道删除分支是否具有相同的效果。


0

第一个父级不总是您预期的上一个当前分支。请参见链接


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接