git checkout
命令详解
概览
git checkout 这条命令的常用格式如下:
用法一
git checkout [<commit>] [--] <paths>
用于拿暂存区的文件覆盖工作区的文件,或者用指定提交中的文件覆盖暂存区和工作区中对应的文件。
用法二
git checkout <branch>
用于切换分支。
用法三
git checkout -b <new_branch> [<start_point>]
用于创建并切换分支。
详细说明
1. git checkout [<commit>] [--] <paths>
第一种用法在命令中包含路径 <paths>
。为了避免路径<paths>
和引用(或者提交)<commit>
同名而冲突,可以在<paths>
前用两个连续的短线减号作为分隔。
<commit>
是可选项,如果省略则相当于从暂存区(index)检出。这和 git reset
重置命令(例如 git reset HEAD <file>
)大不相同:重置的默认值是 HEAD
,而检出的默认值是暂存区。因此重置一般用于重置暂存区(除非使用--hard
参数,否则不重置工作区),而检出命令主要是覆盖工作区(如果<commit>
不省略,也会替换暂存区中相应的文件)。
第一种用法(包含了路径 <paths>
的用法)不会改变 HEAD
头指针,主要是用于拿指定版本的文件覆盖工作区中对应的文件。如果省略<commit>
,则会拿暂存区的文件覆盖工作区的文件,否则用指定提交中的文件覆盖暂存区和工作区中对应的文件。
2. git checkout <branch>
第二种用法(不使用路径<paths>
的用法)则会改变 HEAD
头指针。之所以后面的参数写作<branch>
,是因为只有 HEAD
切换到一个分支才可以对提交进行跟踪,否则仍然会进入“分离头指针”(Detached HEAD)的状态。在“分离头指针”状态下的提交不能被引用关联到而可能会丢失。所以用法二最主要的作用就是切换分支。
3. git checkout -b <new_branch> [<start_point>]
-b
选项表示创建新分支。如果指定了 <start_point>
,那么新的分支将指向<start_point>
,否则新的分支指向当前的 HEAD
. 新分支和我们熟悉的 master 分支并没有什么实质的不同,都是在refs/heads
命名空间下的引用。第三种用法用于分支的创建并切换。
参考资料
《Git 权威指南》