Git承诺父母的命令

时间:2013-08-18 16:30:59

标签: git libgit2 pygit2

提交父母的顺序是否存在约定?

因为提交的父项之一应该是先前在当前分支上提交,而其余的是其他合并分支的以前的提交

我想识别当前分支的先前提交,我正在使用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

4 个答案:

答案 0 :(得分:8)

是的,如果将A合并到B中,则第一个父项为B,第二个项目为A.

因此,您可以执行gitk --first-parent之类的操作,仅显示当前分支的历史记录,而不显示合并分支的详细信息。

答案 1 :(得分:7)

libgit2及其绑定按照它们存储在提交中的顺序返回父节点,这是提交的顺序,例如它们在例如git merge的命令行,它是一个常量,第一个父项是创建新项目时的当前提交(通过合并或普通git commit)。

为了识别先前提交的提交(及时),您需要做的就是查看第一个父级。它们是否在同一个分支中并不是你可以从中看到的东西,因为提交父级可能位于不同的分支中(这是导致分支的原因),但是你可以绘制一条直线(如{{1绘制)。

答案 2 :(得分:0)

第一个父级之后的任何父级表示来自另一个分支的合并,且至少有一个例外。

如果你将一个分支合并到自身中,这通常发生在分别在两个地方进行处理然后再进行整合时,分支中的一个“分支”就会出现,好像它来自哪里。

如果你遍历所有叶子分支的所有父亲,这将显示,但如果你遍历所有叶子分支的线性历史,分支内的分支就不会出现。至少仍然是正确的,因为您只会遍历合并到的提交的线性历史记录。隐藏的是分支内的分支,因此它不会显示该分支独有的所有历史记录。

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

答案 3 :(得分:0)

第一个父级并不总是您期望的上一个当前分支。请参阅link