以前学Git都是需要用到什么功能,才去学什么功能。现在为了完成课上布置的作业,用这个网站系统学了一遍:
https://learngitbranching.js.org/

image.png
图一

学了才发现以前对Git的理解不够深刻。以前也往往不敢使用某些“危险”的命令,怕造成不可逆的操作。现在所学心得如下:

  • 每一次 commit 操作都会保留。如上图所示,C0…C6 都是commit之后产生的快照。
  • 在同一个快照处,重复commit,会产生新的分支。类似于你有一个时间机器,返回到过去某个节点,做了不同的选择,就会创建一个新的平行宇宙,并不影响已有的各个宇宙。
  • 分支名并非那一条分支不变。比如你可以把bugFix分支和master分支交换一下,甚至与把bugFix分支移动到最初始的快照 C0 处!

具体一点

git branch

git branch 相关命令可以创建并移动分支,例:

  1. git branch -f bugFix C0 # 即可把 bugFix 移动到C0 处,如图一右边所示

git checkout

而 git checkout 命令,则可以任意移动 HEAD 到指定快照或者分支处。例:

  1. git checkout C1 # 即可把 HEAD 移动到 C1 处,如图一右边所示
  2. git checkout HEAD^ # 效果同上,也是把 HEAD 移动到 C1 处。 "^"代表移动到HEAD的父节点。
  3. git checkout HEAD~3 # "~3"表示往父节点的方向移动3次。

不过上面3种 git checkout 用法对我来说用的很少。更多的情况是不同分支之间的切换,例:

  1. git checkout bugFix # 即可把 HEAD 移动到 bugFix 所在快照处(如果bugFix不存在,则新建)

注意

如果 HEAD 所在处不是某个分支处,那么进行commit操作,将会显示警告:Warning!! Detached HEAD state。如下图所示:
image.png
图二
这时候,只要在当前位置创建一个新的分支,或者把已有分支移动到这里,就好了。