赞
踩
我们知道在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,没毛病。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。