gitpython脱离头获得最后一次提交

问题描述 投票:0回答:1

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

git checkout HEAD~5

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

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
git gitpython git-detached-head
1个回答
1
投票

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

仅此而已,就这么简单。 Git仅从子级到父级提交链接backwards。因此,每个分支名称必须存储其last提交的哈希ID。

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

git checkout HEAD~5

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

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

给出一连串的提交,例如:

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

all通过I进行的提交都在br2上,即使I也是br1last提交,所以通过I进行的所有提交都在br1。它们在both分支上。提交JKbr2上的[[only。

如果我们删除

name

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. 什么是

    next

提交after提交I?您还需要什么其他信息才能找到下一个提交?请记住,提交I同时在br1br2上。
© www.soinside.com 2019 - 2024. All rights reserved.