欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Git核心概念(三): 分离头指针

最编程 2024-02-25 19:18:33
...

什么是分离头指针

通常,我们的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核心概念(三): 分离头指针