Git:DETACHED HEAD的概念。
博客
原帖收藏于IT老兵驿站,传递一个IT老兵在凋零前的光和氧。
前言
在git
使用的时候,经常会碰到DETACHED HEAD
,在此总结一下。
正文
HEAD normally refers to a named branch (e.g. master). Meanwhile, each branch refers to a specific commit. Let’s look at a repo with three commits, one of them tagged, and with branch master checked out:
HEAD
是一个指针,指向一个branch
。
1 | HEAD (refers to branch 'master') |
上面是一个常见的例子,三个提交,HEAD
指针指向c
,往往是这个分支上最后的提交。然后又进行了一次修改和提交,生成了d
。
1 | $ edit; git add; git commit |
HEAD
指向了d
。
这个时候我们需要重新检出v2.0
版本(这种可能性是很大,经常容易出现的),如下:
1 | $ git checkout v2.0 # or |
这个“^^”符号需要记忆一下。
1 | HEAD (refers to commit 'b') |
这个时候HEAD
指针就指向了b
,这就是detached HEAD
状态,这意味着HEAD
指向了某一个提交了,而不再指向当前分支的最后一个提交了。
然后我们又进行了一次提交,就会变成这样:
1 | $ edit; git add; git commit |
one more time,再来一次:
1 | $ edit; git add; git commit |
1 | HEAD (refers to commit 'f') |
HEAD
指向了f
。
我们可以做任何正常的git
操作,如果你想回到master
分支,那么。
1 | $ git checkout master |
HEAD
重新指向b
。
这个时候要意识到没有指针指向f
提交,最后e
和f
都会被常规的Git垃圾回收所删除掉,除非我们创建一个指针,例如:
1 | $ git checkout -b foo (1) |
- 创建了一个新的分支指向
f
,并且更新了HEAD
指针,这样HEAD
指针就不再是detached
状态了 - 简单创建了一个新的分支指向
f
,这个时候HEAD
指针仍然是detached
状态。
3.创建了一个新tag
,指向f
,这个时候HEAD
指针仍然是detached
状态。
If we have moved away from commit f, then we must first recover its object name (typically by using git reflog), and then we can create a reference to it. For example, to see the last two commits to which HEAD referred, we can use either of these commands:
如果f
已经被移除了,我们首先需要恢复它的对象名,使用git reflog
,然后我们创建一个指针指向它。例如,想看到HEAD
之前的最后两个提交,我们可以使用下面的命令(二选一):
1 | $ git reflog -2 HEAD # or |
总结
这篇总结基本上还是以翻译为主,留了一个问题,就是reflog
。
这些箭头用MD画起来很痛苦,所见不是所得。