以前学Git都是需要用到什么功能,才去学什么功能。现在为了完成课上布置的作业,用这个网站系统学了一遍:
https://learngitbranching.js.org/
图一
学了才发现以前对Git的理解不够深刻。以前也往往不敢使用某些“危险”的命令,怕造成不可逆的操作。现在所学心得如下:
- 每一次 commit 操作都会保留。如上图所示,C0…C6 都是commit之后产生的快照。
- 在同一个快照处,重复commit,会产生新的分支。类似于你有一个时间机器,返回到过去某个节点,做了不同的选择,就会创建一个新的平行宇宙,并不影响已有的各个宇宙。
- 分支名并非那一条分支不变。比如你可以把bugFix分支和master分支交换一下,甚至与把bugFix分支移动到最初始的快照 C0 处!
具体一点
git branch
git branch 相关命令可以创建并移动分支,例:
git branch -f bugFix C0 # 即可把 bugFix 移动到C0 处,如图一右边所示
git checkout
而 git checkout 命令,则可以任意移动 HEAD 到指定快照或者分支处。例:
git checkout C1 # 即可把 HEAD 移动到 C1 处,如图一右边所示
git checkout HEAD^ # 效果同上,也是把 HEAD 移动到 C1 处。 "^"代表移动到HEAD的父节点。
git checkout HEAD~3 # "~3"表示往父节点的方向移动3次。
不过上面3种 git checkout 用法对我来说用的很少。更多的情况是不同分支之间的切换,例:
git checkout bugFix # 即可把 HEAD 移动到 bugFix 所在快照处(如果bugFix不存在,则新建)
注意
如果 HEAD 所在处不是某个分支处,那么进行commit操作,将会显示警告:Warning!! Detached HEAD state。如下图所示:
图二
这时候,只要在当前位置创建一个新的分支,或者把已有分支移动到这里,就好了。