Gitpython 获得最后一个带有分离头的提交



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

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

任何分支中的最后一次提交由存储在分支名称中的提交哈希 ID 给出。

仅此而已 - 它真的就是这么简单。 Git 仅向提交链接,从子项到父项。 因此,每个分支名称都必须存储其上次提交的哈希 ID。

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

git checkout HEAD~5

这样做之后,正如您在标题中所说,您有一个"分离的 HEAD"。 这意味着您不再在任何分支上。 "上次提交"的问题变得毫无意义:HEAD直接指向一个提交,根据定义,该提交就是当前提交。 你可以签出任何你喜欢的提交,例如,通过给git checkout一个原始提交哈希ID,你将继续在一个分离的HEAD上,但在不同的提交上。

效果是你现在在一个匿名分支(一个没有名字的分支)上,其最后一次提交是当前提交。 此时创建一个新分支,指向此提交,会导致该分支存在。 它的最后一次提交是当前提交,所以现在新创建的分支上的最后一次提交是当前提交。

给定一个提交链,如下所示:

... <-F <-G <-H <-I   <-- br1

J <-K   <-- br2
所有到I的提交都在br2

上,即使I也是br1的最后一次提交,因此到I的所有提交都在br1上。 它们在两个分支上。 提交JK仅在br2上。

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

如果此时git checkout br1并创建一个新提交,则会得到:

L   <-- br1 (HEAD)
/
... <-F <-G <-H <-I

J <-K   <-- br2

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

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

L   <-- br1
/
... <-F <-G <-H <-I   <-- HEAD

J <-K   <-- br2

练习(按顺序进行)

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

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

最新更新