本文的主要围绕着下面这个问题展开的,在阅读之前可以先自己思考一下问题的答案是什么?
- • HEAD怎么理解?
- • 分离头指针是个什么玩意?
HEAD
翻译为“头部”,在Git中我们一般称为“头指针”,主要表示当前工作区基于哪个版本进行开发,也可以理解为当前开发所在分支的最后一次提交。
我们一般切换分支都是使用已经创建的分支,例如git checkout master
。另外还有一种操作,就是基于某次提交记录(git checkout commit版本号
),如下图所示
这种操作切换的工作区没有在任何一个分支上面,与任何一个都没有关系。如果后续没有进行保存,在这个上面做的修改会被 git 彻底丢弃。
从提示信息我们可以看出这是处于detached HEAD
的状态,网上解释说这是分离头指针的状态,总感觉有点怪怪的。说人话这就是一种在分支之外的开发状态。
此时我们通过查看.git/HEAD
文件会发现,里面原来存放的分支名称变成了提交记录的版本号。正是我们上面切换分支时使用的提交记录版本号。
如果我们做了修改,并且提交修改记录,以前的分支名变成了detached HEAD 最新的提交版本号
,提示信息会发现如下所示
如果这时候我们需要切回其他分支,Git 会给我们一些提示信息,告知我们有一些修改没有关联分支,并且给了我们新建分支的建议。
想要保存原来在无分支状态做的修改,可以使用基于提交记录新建分支的命令
git branch <new-branch-name> a8dfef1
除此之外,我们还可以使用其他方式保存这些修改。当我们处理分离头指针的状态时,我们可以使用下面的命令创建分支。
git switch -c <new-branch-name>
假设我们不想创建新的分支,我们还可以直接把内容合并到其他分支,比如我们想把内容合并到dev分支,则可以借鉴下面的命令。
# 切换到需要合入代码的分支 git checkout dev # 使用分离头指针状态下提交记录的版本号 git merge <commit版本号>
那么分离头指针操作,适合的场景都有哪些呢?
如果我们想基于某次提交做一些新的尝试,而且不确定这些代码要不要合入正式分支的时候,可以使用这种方式。在上面的修改不会影响其他分支的现有状态,也不用创建新的分支。
如果修改以后发现方案行不通,可以直接切换到其他分支,这里的修改后面会被Git丢弃掉。如果需要保存的话,可以创建新的分支,或者把修改的代码合入某个分支。
总结