"(无分支)"与"(abc1234分离)"之间的区别

Mat*_*w G 3 git libgit2 git-branch pygit2

通常当你在git仓库中运行这样的东西时:

git checkout abc1234
Run Code Online (Sandbox Code Playgroud)

你最终处于一个独立的HEAD状态.如果你运行git branch,输出将如下所示:

* (detached from abc1234)
  master
Run Code Online (Sandbox Code Playgroud)

这是很好的预期行为.

我最近一直在玩pygit2,并且遇到过我以前没见过的东西.假设我做了以下事情:

repo = pygit2.discover_repository("/path/to/repo")
repo.head = "abc1234"
Run Code Online (Sandbox Code Playgroud)

我希望存储库处于独立的HEAD状态.出于所有意图和目的,我相信它是在这样做之后.但是,输出git branch看起来有点不同:

* (no branch)
  master
Run Code Online (Sandbox Code Playgroud)

有谁知道有什么区别,为什么会有差异,这意味着什么?

编辑:

下面是使用pygit2克隆存储库后的reflog,为repo.head分配提交SHA1哈希,然后运行git checkout master,然后运行git checkout myhash:

69df316 HEAD@{0}: checkout: moving from master to 69df3161f315e9b13ba4bd811635c11f67616598
d6ece61 HEAD@{1}: checkout: moving from 69df3161f315e9b13ba4bd811635c11f67616598 to master
69df316 HEAD@{2}:
d6ece61 HEAD@{3}: clone: from file:///path/to/repo
Run Code Online (Sandbox Code Playgroud)

Car*_*eto 5

当处于"分离的HEAD"状态时,git将显示"(无分支)"或"(与abc分离)",具体取决于reflog条目的内容.

在您的代码中,您只需覆盖该值而不提供任何消息,因此不会将任何消息写入reflog(如您在reflog中的HEAD@{2}条目中所示).如果有类似的"结帐"消息,则会显示分离的文本.

pygit2提供Reference.log_append()了将条目附加到日志中,因此您可以创建这样的条目,但是目前它仍然会创建空条目.一旦它支持libgit2 0.21中引入的更新的reflog处理,解决方案就是使用update方法.

引用设置方法Reference.set_target()Repository.set_head()为reflog提供了一个放置自己的标识和消息的位置,您可以使用它来提供与git的checkout命令相同的消息.

您可以尝试以当前的方式进行更新,并手动编写reflog中的条目(它位于.git/logs/HEAD下,它是一个文本文件)来模仿git会写什么,你应该看到"(与abc分离) )"消息出现.