git中可以理解为有两种指针,git的提交记录可以看做是一棵树。两种指针指向不同位置来索引。
- branch name的指针。比如说main就是最一开始有的branch,操作都是基于main这个指针的。
- HEAD指针。HEAD指针其实才是真正指向某一个位置的指针。我们以为main起作用,其实是因为HEAD指向了main。我们也可以用checkout让HEAD指向别的branch name指针,这样就是别的branch起作用了。当然,还可以分离HEAD和branch name,让HEAD指向某一个提交位置。
git checkout -b new 会在当前位置创建一个新的branch,并将HEAD指向它。
git checkout <branch-name> 将HEAD指向某个branch。
git checkout <hash name> 将HEAD指向某个提交位置,这一操作会将HEAD和branch分离。
git branch -f <branch-name> <position> 强制将某个branch name的指针移动到position这个位置。position可以有几种指定方式
- 用hash值做绝对引用。
- 用其他branch name或者HEAD,以及用HEAD^,HEAD~2这类相对引用。
尽管这些复杂的移动branch和HEAD的操作基本都用不到,但是可以很好地理解树是怎么长大的,不同的branch之间的关系。