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

gitpython使用分离的头获取最后一次提交,git,gitpython,git-detached-head,Git,Gitpython,Git Detached Head,在最新的存储库中,我们执行以下操作: git签出头~5 然后使用GitPython,我们可以获得headcommit,它是分离的: 导入git repo=git.repo(‘.) 头=回购头 head\u commit=head.commit 打印(磁头已分离) >真的 在GitPython中是否有方法获取分支中的最后一次提交? 我在想一些大致如下的事情: last=repo.active_branch.last_commit#分离磁头时,active_branch将抛出错误。 或 las

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

git签出头~5
然后使用GitPython,我们可以获得headcommit,它是分离的:

导入git
repo=git.repo(‘.)
头=回购头
head\u commit=head.commit
打印(磁头已分离)
>真的
在GitPython中是否有方法获取分支中的最后一次提交?

我在想一些大致如下的事情:

last=repo.active_branch.last_commit#分离磁头时,active_branch将抛出错误。

last=head\u提交
#我甚至不知道在git中谈论儿童犯罪是否有意义。
虽然last.child不是无:
last=last.child
任何分支中的最后一次提交由存储在分支名称中的提交哈希ID给出

就这么简单。Git只向后提交链接,从子级到父级。因此,每个分支名称必须存储其上次提交的哈希ID

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

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

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

给定一系列提交,如:

... <-F <-G <-H <-I   <-- br1
                   \
                    J <-K   <-- br2
请注意,
HEAD
现在连接到分支
br1
。提交
L
是此分支中的最后一次提交;通过
I
的提交在两个分支中

如果现在拆下
头部
并将其移动到提交
I
,您将得到:

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

我想我明白了。由于git历史是一棵树,一次提交有一个父级,但可能有0到多个子级。但是孩子们的信息并没有被存储,只有父母、这棵树的叶子(每个分支)和一些其他中间指针(比如我们分离的头)。你的问题的答案是:1。通过从
K
开始,我们可以迭代地获取提交的父级,将哈希推到堆栈中,然后继续,直到到达
F
的哈希。然后
G
的散列将在堆栈中。2.我们需要在这两个分支中的任何一个分支中的另一个提交来执行anwser(1.)正确的进程。请注意,尽管合并提交有两个(或更多)父级,但这使事情变得复杂:您必须沿着两个父级链接向后走。(合并将数据结构从树更改为图—Git中的有向无环图。对于您的特定情况,您可能不需要担心合并提交。)
                    L   <-- br1
                   /
... <-F <-G <-H <-I   <-- HEAD
                   \
                    J <-K   <-- br2