Git 中的 HEAD 能够理解为指针,指向当前仓库所处的分支。通常在有 Git 管理的目录下打开 Git 终端都能在当前路径的尾巴上,看到所处的分支名。 html
还能够在命令行中输入 cat .git/HEAD
查看当前 HEAD 指向哪里。 git
通常它指向当前工做目录所在分支的最新提交。 github
通常咱们会使用命令 git checkout <branch_name>
来切换分支,HEAD 就会移动到指定的分支上。 ide
可是,若是咱们使用的是 git checkout <commit_id>
来切换到指定的某一次提交,HEAD 就会处于「detached」状态,也就是游离状态。 ui
好处:HEAD 处于游离状态时,开发者能够很方便地在历史版本之间互相切换,好比要回到某次提交,只须要 checkout
对应的 commit id
或者 tag
名便可。命令行
弊端:若在该基础上进行了提交,则会新开一个「匿名分支」;也就是说咱们的提交是没法可见保存的,一旦切换到别的分支,原游离状态之后的提交就不可追溯了。 3d
下面咱们来看看实际的例子。指针
首先查看一下当前的分支状况,当前只有一个 master
分支: 日志
再来查看下近期的 log
日志: code
而后假设我要回到倒数第二条 commit 时候的状态,顺便查看下本地工做目录状态以及分支状态:
能够看到,我尚未修改和提交的状况下,切换完成就给我新建了一个分支,而且指明 HEAD
正游离在 2772886
的 <commit id>
上。
若是不作任何修改,想回到 master
分支,直接 git checkout master
便可,而不要 checkout master 主干所对应的 <commit id>
。
顺利回到主干的话,HEAD 的游离状态会取消,原临时游离分支也会消失。
若是是在游离状态作了修改和提交,则:
切换会 master 分支时,在游离状态所作的修改和提交没法追溯:
其实很简单,刚才有仔细看终端提示的同窗就会知道,在切换到游离状态的时候应该新建一个分支,而后咱们全部的操做修改和提交都会保存到该分支,HEAD 也就指向了该分支最新提交的 commit id 处,而不会再处于游离状态。
当在新建分支上修改提交完毕时,就切换回 master 分支,将原分支合并到 master 分支就万事大吉了。 到这里就再也不操做演示了,你们都懂。
部分图片摘自《图解Git》: marklodato.github.io/visual-git-…
文章参考《Git 手册》: git-scm.com/docs/git-ch…