1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 【git 基础】detached HEAD意义详解 (非顶端分支的理解)

【git 基础】detached HEAD意义详解 (非顶端分支的理解)

时间:2024-04-19 15:58:15

相关推荐

【git 基础】detached HEAD意义详解 (非顶端分支的理解)

概述:在使用git的过程中,我们常常会对其中的HEAD感到疑惑:HEAD是什么意思?表示当前分支吗?什么是处于游离态的commit点?等等,这些都和一个叫做detached head的状态有关,我们来看看它的真面目。

通常情况下,HEAD指向一个分支;同时,每一个分支对应一个特定的commit(确切的说,一个分支上可以有多个commit,但是只有一个顶层commit,而且commit之间是简单的线性关系)。我们来看下面这个包含三个commit的例子,其中目前在master分支上。

HEAD (refers to branch 'master')

|

v

a---b---c branch 'master' (refers to commit 'c')

^

|

tag 'v2.0' (refers to commit 'b')

在这样的状况下,如果进行一次提交,当前分支将指向新的提交点。具体来说,git commit创建了一个新的commit id,它的父节点是的commit的id是C。这个时候,HEAD仍然指向master分支,而且指向commit id是d的提交点。

$ edit; git add; git commit

HEAD (refers to branch 'master')

|

v

a---b---c---d branch 'master' (refers to commit 'd')

^

|

tag 'v2.0' (refers to commit 'b')

有时,如果能够检出到一个不在分支顶端的commit点是很有用的(通常情况下,我们直接运行命令git checkout mater,这样checkout到master的最新commit上);同样,如果能够创建一个不属于任何分支的提交点也是一件很有用的事情。运行接下来的两条命令,看看会发生什么。

$ git checkout v2.0 # or

$ git checkout master^^

HEAD (refers to commit 'b')

|

v

a---b---c---d branch 'master' (refers to commit 'd')

^

|

tag 'v2.0' (refers to commit 'b')

注意,现在head已经指向commit b,这就是所谓的dedatched head状态。从这里我们也可以看出,head是当前index的状态,而不是当前分支(的最近commit节点)。这仅仅意味着head指向某个特定的commit点,而不是指向每一个特定的分支(的顶端节点)。如果我们此时提交一个commit,看看将要发生什么:

$ edit; git add; git commit

HEAD (refers to commit 'e')

|

v

e

/

a---b---c---d branch 'master' (refers to commit 'd')

^

|

tag 'v2.0' (refers to commit 'b')

注意,此时产生了一个新的提交点,但是它只能被head索引到,不属于任何一个分支。当然,我们还可以给在这个“无名分支”的基础上继续提交。

$ edit; git add; git commit

HEAD (refers to commit 'f')

|

v

e---f

/

a---b---c---d branch 'master' (refers to commit 'd')

^

|

tag 'v2.0' (refers to commit 'b')

实际上,我们可以进行任何git的常规操作。但是,让我们开看看如果我们运行git checkout master将会发生什么:

$ git checkout master

HEAD (refers to branch 'master')

e---f |

/v

a---b---c---d branch 'master' (refers to commit 'd')

^

|

tag 'v2.0' (refers to commit 'b')

此时,我们一定要注意,e f已经处于无法被索引到的状态。最终e和f将被git的默认回收机制所回收,除非我们在它们被回收之前创建一个指向他们的索引。如果我们没有从commit f离开的话,可以用接下来的命令创建一个指向f的索引。

$ git checkout -b foo (1)

$ git branch foo (2)

$ git tag foo(3)

1.创建来一个foo分支,指向f,接着更新head指向分支foo,此时,我们不再处在detached head的状态

2.同样创建了一个foo分支,但是head仍然指向master分支,仍然处在detached head的状态。

3.创建了一个新标签foo,仍处于detached的状态。

如果我们从f处离开,我们必须首先恢复他的主体名称,接着我们才可以创建指向它的索引。例如,为了看看最近的两个由head指向的commit点,我们可以使用如下的命令:

$ git reflog -2 HEAD # or

$ git log -g -2 HEAD

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。