在最新的存储库中,我们执行以下操作:
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
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
也是br1
的last提交,所以通过I
进行的所有提交都在br1
。它们在both分支上。提交J
和K
是br2
上的[[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
练习(按顺序进行)提交after提交
- 我将为您提供两个原始的提交哈希ID,但前提是可以通过从第二个提交开始并向后走,沿着这些向后的箭头一次一步,即可到达第一个提交的哈希ID。例如,我可以为您提供提交
F
的哈希ID和提交K
的哈希ID。您如何使用此信息来查找提交G
? (考虑从提交K
开始并跟随每个箭头,同时保留每次访问的某种日志记录。)- 什么是
next
I
?您还需要什么其他信息才能找到下一个提交?请记住,提交I
同时在br1
和br2
上。