Git头指针分离状态

一、什么是分离头指针状态?

我们知道在Git中分支是指向提交,而HEAD指针指向分支。所谓的分离头指针状态就是HEAD不再指向分支,而是直接指向某个commit。

二、理解

对于下图,此时分支master分支指向c1(c1是某次提交的commit id),HEAD指向master。
在这里插入图片描述
进行任意一次提交,master分支会重新指向新的提交。
在这里插入图片描述
如果执行 git checkout commitId就会导致HEAD指向该次提交,而不在指向分支。

如果我们执行git checkout c2(c2是该次提交的commit id),结果如下:
在这里插入图片描述
可以看到此时HEAD指针不在指向master而是直接指向c2提交,此时头指针就处于分离状态。

如果这时候修改了工作区的内容然后提交会怎样呢?
在这里插入图片描述
可以看到此时这个提交不在任何分支上。如果此时切换回master分支,你会发现刚刚在分离头指针状态下对文件做了修改提交在master分支下是看不到的,并且由于c3这次提交不在任何分支上,在未来极有可能会被Git清理掉。我们知道如何合并分支,但是没办法将c3这个提交给合并过来,难道我们刚刚在c3上做的大量修改都要重写?聪明的git早就给我们提示了,可以给这个分离的提交创建一个分支,然后在将这个分支合并到master中,最后删除这个临时的分支。

通过git branch branchName commitId给这个提交创建一个临时的分支,这个分支是基于头指针分离下修改提交的commit id创建的。
在这里插入图片描述
合并分支:git merge temp
在这里插入图片描述
最后删除临时分支:git branch -d temp
在这里插入图片描述

三、实战

创建一个仓库,在工作区增加test.txt,然后基于这个文件做两次commit。
在这里插入图片描述
可以清楚的看到此时的HEAD是指向master的(HEAD -> msstaer),,而master指向最近一次提交。看一下test.txt文件:
在这里插入图片描述
现在开始分离HEAD指针,让HEAD直接指向最近一次提交。
在这里插入图片描述
注意观察,当我们执行git checkout 8fcba5e37c,git会提示我们当前处于分离头指针状态,并且HEAD指向8fcba5e37c这次提交。
执行git status看看
在这里插入图片描述
现在HEAD指针指向的是提交,这时我们再修改test.txt文件,然后提交。
在这里插入图片描述
git提示我们再分离HEAD指针状态下提交了修改。再打开test.txt文件看一眼:enmmm,没毛病。
在这里插入图片描述
重点来了!现在切换回master分支:
在这里插入图片描述
ok!成功切换了,但是git给我们警告了,有一个未被关联在任何分支上的提交,并且告诉我们可以使用git branch branchName 5e2e3f7 为5e2e3f7这次提交创建一个分支。先来瞅一眼此时的test.txt文件:
在这里插入图片描述
enmm,确实少了789。如果我们执行gitk --all命令会弹出一个界面如下:
在这里插入图片描述
从这个界面我们可以发现,只能看到两次提交记录,关于789的提交记录看不到,这是因为它没有关联在任何分支上,并且在未来git也极有可能会把它清理掉。
执行git branch temp 5e2e3f7 为该提交创建一个temp分支,然后合并分支,最后删除temp分支:
在这里插入图片描述
最后再瞅一眼test.txt。enmm,没毛病。
在这里插入图片描述

自我实践:

wangye:wangye-testgit xxx$ git branch
  0vv
* master
wangye:wangye-testgit xxx$ cat README.md 
hhhhhhh
mmmmm
wolaile
wangye:wangye-testgit xxx$ vi README.md 
wangye:wangye-testgit xxx$ cat README.md 
hhhhhhh
mmmmm
wolaile
nnnnnn
wangye:wangye-testgit xxx$ git add .
wangye:wangye-testgit xxx$ git commit -m "nnnnn"
[master f3c6bdb] nnnnn
 1 file changed, 1 insertion(+)
wangye:wangye-testgit xxx$ git checkout f3c6bdb
注意:正在切换到 'f3c6bdb'。

您正处于分离头指针状态。您可以查看、做试验性的修改及提交,并且您可以在切换
回一个分支时,丢弃在此状态下所做的提交而不对分支造成影响。

如果您想要通过创建分支来保留在此状态下所做的提交,您可以通过在 switch 命令
中添加参数 -c 来实现(现在或稍后)。例如:

  git switch -c <新分支名>

或者撤销此操作:

  git switch -

通过将配置变量 advice.detachedHead 设置为 false 来关闭此建议

HEAD 目前位于 f3c6bdb nnnnn
wangye:wangye-testgit xxx$ cat README.md 
hhhhhhh
mmmmm
wolaile
nnnnnn
wangye:wangye-testgit xxx$ vi README.md 
wangye:wangye-testgit xxx$ cat README.md 
hhhhhhh
mmmmm
wolaile
nnnnnn
oooooo
wangye:wangye-testgit xxx$ git add .
wangye:wangye-testgit xxx$ git commit -m "ooooo"
[分离头指针 468ea02] ooooo
 1 file changed, 1 insertion(+)
wangye:wangye-testgit xxx$ git checkout master
警告:您正丢下 1 个提交,未和任何分支关联:

  468ea02 ooooo

如果您想要通过创建新分支保存它,这可能是一个好时候。
如下操作:

 git branch <新分支名> 468ea02

切换到分支 'master'
您的分支领先 'origin/master' 共 1 个提交。
  (使用 "git push" 来发布您的本地提交)
wangye:wangye-testgit xxx$ cat README.md 
hhhhhhh
mmmmm
wolaile
nnnnnn
wangye:wangye-testgit xxx$ git branch temp 468ea02
wangye:wangye-testgit xxx$ git branch
  0vv
* master
  temp
wangye:wangye-testgit xxx$ git merge temp
更新 f3c6bdb..468ea02
Fast-forward
 README.md | 1 +
 1 file changed, 1 insertion(+)
wangye:wangye-testgit xxx$ cat README.md 
hhhhhhh
mmmmm
wolaile
nnnnnn
oooooo
wangye:wangye-testgit xxx$ git push
枚举对象中: 8, 完成.
对象计数中: 100% (8/8), 完成.
使用 4 个线程进行压缩
压缩对象中: 100% (4/4), 完成.
写入对象中: 100% (6/6), 537 字节 | 537.00 KiB/s, 完成.
总共 6(差异 0),复用 0(差异 0),包复用 0
To ssh://gitlab.xxx-int.com:8022/wangye_xxx/wangye-testgit.git
   589d1d9..468ea02  master -> master
wangye:wangye-testgit xxx$ 

参考:https://blog.csdn.net/start_mao/article/details/94722393?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~first_rank_v2~rank_v25-1-94722393.nonecase&utm_term=%E5%A4%B4%E6%8C%87%E9%92%88%E5%88%86%E7%A6%BB&spm=1000.2123.3001.4430

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值