通常,我们工作在某一个分支上,比如 master 分支。这个时候 master 指针和 HEAD 指针是一起前进的,每做一次提交,这两个指针就会一起向前挪一步。但是在某种情况下(例如 checkout 了某个具体的 commit),master 指针 和 HEAD 指针这种「绑定」的状态就被打破了,变成了分离头指针(detacged HEAD)状态。
如果执行了 git checkout tag名
或 git checkout 远端分支名
或 git checkout 提交记录哈希值
,则HEAD会指向指向某一提交记录,这都会导致分离头指针。
有时你在切换分支时,输了一个 commit 信息
Git 提示你现在处于“分离头指针状态”,你可以查看、并且做些代码调试,还可以提交他们,在这种状态下,如果checkout到其他分支,完全可以丢弃在此基础上做的修改, 而不会影响到其他分支。 如果你想保留本次的修改,你可以使用”git checkout -b 新的分支名”来保留它(现在或者以后都可以)。
有时候我们不想为某次的修改单独创建一个分支,也没有想要提交到版本库的意思,只是做下调试,那么我们就可以使用git提供的分离头指针方法。如果发现真的有必要提交到版本库,还可以使用git checkout -b命令来为这次的提交新建一个分支,再把分支合并上去。
下面具体演示下分离头指针的操作
现在修改了 style/style.css 文件,并且 commit 了
这时候用git log查看历史信息时,发现之前HEAD这变都会指向一个分支,然而这边却没有。这个就叫分离头指针状态:
假设这时你接到了一个紧急任务,需要切换分支
它会有一个警告说:现在有一个 commit 没有加到分支上去。也就是说这个 commit 一会会被垃圾清理掉。我们可以 gitk --all
来查看有没有add main 的 commit 信息。
从上图可以看出,这个 commit 没有和某个分支绑着,也没有和某个tag绑着,在 git 眼里,这种commit日后都是要被清除的。
假如这个时候我醒悟过来了,觉得这个commit很重要,按照它的指示信息建一个分支,将它保留下来。
此时你可以看到 add main 的 commit 被保留了下来。
如果你想要添加到某个分支上,再用 merge
比如你想添加到 master 分支上,将 HEAD 切换到 master 分支,然后用git merge css,就将这次 commit 添加到 master 上了。