在日常的git操作中,git checkout——检出,是我们的常用命令。最为常用的两种情形是创建分支和切换分支。
在下面的命令中,使用了一些简写,在这里说明一下:
1 2 3 4 5 6 | git st # git status git ci # git commit git br # git branch git co # git checkout git mg # git merge git line # git log --oneline |
当然,你也可以直接在git中敲命令,将这些简写添加到git配置中
1 | git config --global -e |
然后,可以插入下面的配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | [alias] st = status co = checkout br = branch mg = merge ci = commit md = commit --amend dt = difftool mt = mergetool last = log -1 HEAD cf = config line = log --oneline latest = for-each-ref --sort=-committerdate --format='%(committerdate:short) %(refname:short) [%(committername)]' ls = log --pretty=format:\%C(yellow)%h %C(blue)%ad %C(red)%d %C(reset)%s %C(green)[%cn]\ --decorate --date=short hist = log --pretty=format:\%C(yellow)%h %C(red)%d %C(reset)%s %C(green)[%an] %C(blue)%ad\ --topo-order --graph --date=short type = cat-file -t dump = cat-file -p |
这样,你也就可以使用这些简写的命令咯。下面步入正题啊。
(一)基础——千里之行,始于切糕(checkout)
先熟悉下常用操作,创建分支和切换分支,也可以称为检出分支。
首先我们新建一个仓库gitTest,然后新建文件a,为什么要用a命名呢,这里是故意为之,后面为大家揭晓分支。呵呵。或许下面的介绍会有些枯燥乏味,因为您已经对这些命令烂熟于胸,而且运用得相当熟练,那么您可以直接跳过这一步。
在master分支上,做一次提交c1,然后现在新建一个分支a,并切换到a分支。
这个操作主要会用到两个命令:
创建新分支:git branch branchName
切换到新分支:git checkout branchName
然后,上面两个命令也可以合成为一个命令:
1 | git checkout -b branchName |
新建远程分支
1 | git push origin master:nggjc_project_XXXXXXX |
(二)真相——HEAD是checkout的灵魂
其实,我们在切换分支,和新建分支的时候,有没有想过,这些操作操作背后的工作原理是怎样的呢?最大的功臣就是.git目录下的HEAD引用,她宛如一个芭蕾舞者,从一个分支飘逸的跳到另一个分支,虽无声无息,却精准无比。
在我们身处master分支的时候,您一定很好奇,当前的HEAD的内容是什么?不妨来看看吧。
我们看到c1的提交hash值和HEAD对应分支master的当前hash值是一样的。也就是说,HEAD指向的是当前分支名master,而master又对应了当前的最新的一次提交ID.
好,那么我们再做一次提交,看看master对应的hash值有无变化。
从上图,我们可以不难看出,HEAD对应的ref没有变化,还是master,但是master对应的commit ID却变成了c2对应的commit ID,即更新为最后一次提交的ID咯。
现在,提交一次的原理,我们已然了解,那么切换分支的时候呢??
现在我们身处master分支,然后我们切换到a分支,看看会发生什么样的情况吧。