gitpython 获取分离头的最后一次提交

gitpython get last commit with detached head

在最新的存储库中,我们执行以下操作:

git checkout HEAD~5

然后使用GitPython,我们可以获得head提交,它是分离的:

import git

repo = git.Repo('.')
head = repo.head
head_commit = head.commit
print(head.is_detached)
> True

GitPython有没有办法获取分支中的最后一次提交?

我正在考虑以下内容:

last = repo.active_branch.last_commit  # active_branch will throw an error when head is detached.

last = head_commit
# I dont even know if talking about child commits makes sense in git.
while last.child is not None:
    last = last.child

any 分支中的最后一次提交由存储在分支名称.

中的提交哈希 ID 给出

就是这样——真的就是这么简单。 Git 仅 向后 提交 link,从 child 到 parent。所以每个分支名称必须存储其最后提交的哈希ID。

In a up-to-date repository we do the following:

git checkout HEAD~5

完成此操作后,如标题中所述,您将拥有一个“分离的 HEAD”。这意味着您不再在任何分支。 “最后一次提交”的问题变得毫无意义:HEAD 直接指向一个提交,而该提交根据定义是 current 提交。您可以检查您喜欢的任何提交,例如,通过给 git checkout 一个原始提交哈希 ID,您将继续处于分离的 HEAD 上,但在不同的提交上。

效果是您现在位于一个匿名分支(没有名称),其 last 提交是 current 提交。此时创建一​​个新分支,指向这个提交,导致该分支出现。它的最后一次提交是当前提交,所以现在新创建的分支上的最后一次提交是当前提交。

给定一系列提交,例如:

... <-F <-G <-H <-I   <-- br1
                   \
                    J <-K   <-- br2

所有I 的提交都在 br2,即使 I 也是 最后 br1 的提交,这样通过 I 的所有提交都在 br1 上。他们在两个分支。提交 JK br2

如果我们删除 name br1,所有提交都可以通过名称 br2 继续找到。 Git 通过从(所有)分支名称和其他此类名称中读取每个哈希 ID 来查找(所有)提交,然后从这些提交向后工作到它们的 parents,再到 parents ' parents,依此类推。

如果此时您 git checkout br1 并创建一个新的提交,您将得到:

                    L   <-- br1 (HEAD)
                   /
... <-F <-G <-H <-I
                   \
                    J <-K   <-- br2

请注意 HEAD 现在附加到分支 br1。 Commit L 是该分支的最后一次提交;通过 I 的提交在两个分支中。

如果您现在分离 HEAD 并将其移至提交 I,您将得到:

                    L   <-- br1
                   /
... <-F <-G <-H <-I   <-- HEAD
                   \
                    J <-K   <-- br2

练习(按顺序进行)

  1. 我会给你两个原始提交哈希 ID,前提是第一次提交的哈希 ID 可以通过从第二次提交开始并向后走,沿着这些一次一步 backward-pointing箭头。例如,我可能会给你提交 F 的哈希 ID 和提交 K 的哈希 ID。您如何使用此信息来查找提交 G? (考虑从提交 K 开始并跟随每个箭头,同时保留每次访问的提交的某种日志。)

  2. 什么是下一个提交之后I?为了找到下一次提交,您还需要哪些其他信息?请记住,提交 Ibr1br2 上。