Git核心概念(三): 分离头指针
什么是分离头指针
通常,我们的git工作在某一个分支上,比如 master 分支。这个时候 master 指针和 HEAD 指针是一起前进的,每做一次提交,这两个指针就会一起向前挪一步。但是在某种情况下(例如 checkout 了某个具体的 commit),master 指针 和 HEAD 指针这种「绑定」的状态就被打破了,变成了分离头指针状态。如下图所示
实例演示
这里以本地git仓库master分支为例,首先通过git log命令查看提交记录
commit 5dda4591f28955e4eaba649e46301e0d20869ffa (HEAD -> master, tag: test)
Author: xxx <xxx@xxx.com>
Date: Sun Dec 13 19:02:57 2020 +0800
add demo.html and modify readme
commit 84ed89a79f290cbdab68bdc9468859a05d9fac77
Author: xxx <xxx@xxx.com>
Date: Sun Dec 13 18:57:21 2020 +0800
init proj
可以看到,当前master分支有两次提交,且HEAD与master最新一次提交指向是相同的,下面通过git checkout
命令将头指针分离。
将头指针指向master分支的上次commit,这时git会出现提示,告知使用者当前处于分离头指针(detached HEAD)状态,虽然你可以继续开发,但是你的改动在切换分支后会丢失,为了避免这种情况,你可以基于当前状态,创建一个新的分支用于保存你的改动;
> git checkout 84ed89a79f
Note: checking out '84ed89a79f'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b <new-branch-name>
HEAD is now at 84ed89a init proj
此时的git log如下
commit 84ed89a79f290cbdab68bdc9468859a05d9fac77 (HEAD)
Author: xxx <xxx@xxx.com>
Date: Sun Dec 13 18:57:21 2020 +0800
init proj
如何在分离头指针状态下保存你的改动
上面提到过,虽然在该状态下并不影响你的开发,但是当你切换到其他分支或者切换回master时,你的改动将被git 在不久的将来丢弃掉。可以看到这种状态下切换回master分支,git会贴心的给出提示,建议你尽快将刚刚的分离头指针下的commit与一个新建的分支进行绑定
...在分离头指针状态下修改了一些文件并提交...
> git checkout master
Warning: you are leaving 1 commit behind, not connected to
any of your branches:
bac767b modify readme
If you want to keep it by creating a new branch, this may be a good time
to do so with:
git branch <new-branch-name> bac767b
Switched to branch 'master'
当然也可以在切换分支之前进行操作
> echo "abc" > readme.txt
> git add -u
> git commit -m "modify readme"
[detached HEAD 713aeaa] modify readme
1 file changed, 1 insertion(+)
> git checkout -b detached_temp
Switched to a new branch 'detached_temp'
> git checkout master
Switched to branch 'master'
这时可以看到,当前的分支如下 我们的改动作为一个新的分支被保存下来了
总结
分离头指针简单来说就是一种基于某个commit的无分支模式,如果不将其与某个分支绑定,那么改动将会被git当做垃圾定期清理掉,所以当你希望保留改动时,一定要关联分支;
系列文章(持续更新中)
Git基础概念相关文章汇总:
Git核心概念(一): 工作区与暂存区
Git核心概念(二): .git目录探秘
Git核心概念(三): 分离头指针
上一篇: pytorch 构建网络模型
下一篇: 大模型参数高效微调技术实战(六)-IA3
推荐阅读