9

提交父母的顺序是否有一些约定?

因为提交的父母之一应该是要合并到的当前分支上的先前提交,其余的是其他合并分支的先前提交。

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

4 回答 4

12

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

因此,您可以做一些事情,例如gitk --first-parent仅显示当前分支的历史记录,而不显示合并分支的详细信息。

于 2013-08-18T17:04:34.083 回答
9

libgit2并且它的绑定按照它们存储在提交中的顺序返回父级,这是提交的顺序,因为它们在例如命令行中给出git merge,并且第一个父级是当前提交时的常量创建一个新的(通过 merge 或 normal git commit)。

为了识别先前的提交(及时),您需要做的就是查看第一个父级。它们是否在同一个分支中不是你可以从中看到的,因为提交父级可能在不同的分支中(这就是导致分支的原因),但你可以画一条直线(就像那些git log --graph --oneline画一样)。

于 2013-08-18T17:19:57.690 回答
0

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

如果您将一个分支合并到自身中,这通常发生在它分别在两个地方工作然后再集成时,一个分支中的这些“分支”之一将看起来好像它来自无处。

如果您遍历所有叶分支的所有父级,这将显示出来,但如果您遍历所有叶分支的线性历史,分支内的此类分支将不会显示。从某种意义上说,这至少仍然是正确的,因为您只会遍历合并到的提交的线性历史。将隐藏的事实是分支中有一个分支,因此它不会显示该分支独有的所有历史记录。

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

于 2017-09-27T19:24:59.217 回答
0

第一个父级并不总是您期望的前一个当前分支。请看链接

于 2020-07-09T05:37:42.073 回答