当我检出特定的提交哈希时,它将进入分离模式,在这种模式下HEAD POINTER无法指向最近的提交。

我们可以做些什么,去分离头状态的用途是什么在Git中?

#1 楼

使用GIT的“正常”方法是检出分支。 HEAD是该分支中最新提交的“指针”,GIT将允许您在该指针之后提交新更改。
但是,正如您所发现的,可以检出特定的提交哈希,如果你想要。在这种情况下,如果您进行更改并尝试提交更改,则您将无法执行此操作,因为您不在HEAD位置,而GIT将不允许您提交更改。
大多数情况下,已脱离如果要测试项目在特定时间点的运行方式,请使用HEAD(签出较早的提交)。
如果您需要更改代码或需要使用Jenkins MultiBranch Pipelines进行构建,例如,还可以通过运行以下命令从该特定提交创建新分支:
git branch my_new_fancy_branch 7y8u33iigit checkout -b my_new_fancy_branch 7y8u33ii
...其中7y8u33ii是您在问题中提供的哈希。对于这个新分支,7y8u33ii将为HEAD,因此您将能够提交新更改。如果需要将代码放入创建此新分支的分支中,则需要进行合并,但这是另一个讨论。

评论


语句“…您将无法执行此操作,因为您不在HEAD,GIT将不允许您提交更改”。在分离模式下,您可以执行任何所需的操作。有关详细信息,请参见我的答案。

– siegi
18年11月11日在14:07

#2 楼

HEAD是Git中的特殊参考,总是指向您当前已签出的“事物”。此“事物”可以是本地分支(HEAD处于连接模式)或特定的提交(HEAD处于分离模式)。

在连接模式下,HEAD绑定到它引用的分支。当前提交由该分支的位置确定。如果您四处移动HEAD(例如,通过提交或重置),实际上HEAD不会被修改,仍然指向分支,而是分支被移动。

如果切换到分离模式(例如,通过git checkout --detach或检出特定的提交,标记或远程分支),HEAD直接指向提交哈希。您可以像以前一样继续使用Git,但是在移动HEAD时不会修改任何分支。这次HEAD直接在每个这样的操作上进行了修改。

因此回答您的特定问题“我们可以做什么”:在分离模式下,我们可以执行在连接模式下可以做到的任何事情(提交,合并,重置,推送...),而无需先创建分支。但是,我们需要注意:签出另一个提交时,不再有任何内容引用原始提交,并且丢失了*。

更难回答的问题是“它的用途是什么”。正如rasebo在他的回答中所述,通常是快速签出一个较早的提交,以查看此时项目的外观。但是还有更多用例。例如,在交互式变基期间使用分离模式。另外,我经常在个人工作流程中使用它来快速创建原型或实验期间的一次性快照。我也可以为此使用临时分支,但是我认为这取决于个人品味和习惯。

要使整个主题更好,它可以帮助您玩转并观察.git/HEAD和执行不同的Git命令后,将修改.git/refs/heads/中的分支。


*好吧,不是真的迷路,只是无法进入。可以还原,例如通过在reflog中查找哈希,然后将其检出。仅在未来90天(默认)的垃圾收集(手动或自动)后不可撤消地删除。

评论


这应该是正确的答案!就个人而言,我使用临时分支,但很高兴知道我也可以使用分离模式

–秋浪
19-10-15在8:16