在做往年习题发现了这样一道题,开始判断b是正确的,但是不知道d的具体作用,于是查询相关资料进行了研究。
一.创建分支并切换
针对该选择题中的b和d指令,我们在本地仓库进行实验。先查询本地分支
确定本地只有B1一个分支后,我们输入B中指令,并再次查询本地分支,可以看到成功创建分支314change,并进行了切换
再测试d中指令,可以看到连提示都和b中指令一致,证明这两者等价。
这两个指令和先用git branch 314change生成分支,再用git switch 和git checkout切换效果也完全一致。那么我们不由提出一个疑问:checkout和switch究竟有什么区别呢?
二.checkout与switch
(1) 实际上checkout的功能比switch更加强大,当我们用文件名替换checkout后面的分支名或 commit 指针时,文件在工作区的修改将被丢弃,还原到分支中的状态。
以git checkout -- test.txt指令为例,我们切换到相应分支修改了 test.txt文件后,可以用该指令将文件还原到当前分支最近一次 commit 的状态。
我们查询git文档时就会发现,最后一行checkout指令有相应参数:git checkout <tree-ish> -- <pathspec>,<tree-ish>常常是commit哈希值或分支名。默认情况下它是当前分支,但它也可以是任何其它分支或 commit。 <pathspec>为指定文件名,所以当我们使用git checkout master -- test.txt指令时,我们就能把当前分支中的 test.txt
文件切换成 main
分支中的版本。
(2)checkout具有多功能性,这在某些时候反而容易造成令人疑惑的问题,特别是在文件名和分支名重名的时候,于是出现了switch指令--它实际上是checkout功能拆分的产物。
switch仍然具有切换分支和创造分支的功能,也可以切换到某个 commit 并将它转变为分离HEAD状态,但不能像checkout那样直接使用,需要加上-d参数。
恢复文件版本的功能则被分担到restore指令,git restore -- test.txt可以把文件恢复到当前分支最近一次commit的状态。