git checkout 命令主要有两大用途——切换分支和恢复文件。
HEAD是一个“头指针”,其所引用的提交作将为一个“基础版本”,当执行提交操作时 ,HEAD指向的提交将作为新提交的父提交。
.git/HEAD文件的内容就是HEAD的指向,该内容通常是一个分支引用(分支游标)。如下图所示,HEAD当前指向main分支游标,refs/heads/main是main分支的全称,即main是refs/heads/main的缩写。
git checkout
命令执行上图中的全部操作1、2、3,即:
1、更新HEAD以指向
2、用
3、用
注意:参数写作分离头指针状态
”。
在上图例子中,执行如下命令可以切换至已存在的dev分支。
$ git checkout dev
执行结果如下图所示,HEAD被更新为指向dev分支,暂存区和工作区中的文件被重置为跟dev分支的最新提交——(2233b28)提交中的文件一致。
注意:由于检出命令会重置暂存区和工作区,因此,如果工作区或暂存区存在未提交的改动,切换将会失败,此时有两种选择。
第一种做法是提交改动,先使用git add .添加改动到索引(暂存区)以准备提交,并使用git commit -m "提交说明"执行一次提交,然后再切换分支。
第二种做法是丢弃改动,先使用git reset --hard撤销暂存区和工作区的改动,并使用git clean -dxf清理新增文件和文件夹,然后再切换分支。
还有另一种丢弃改动的做法是使用 -f 参数进行强制切换,即执行git checkout -f
当暂存区或工作区存在未提交的改动时,将无法执行checkout命令。使用 -f 参数可以丢弃暂存区和工作区的改动,强制执行checkout命令。
如执行git checkout -f dev将强制切换至dev分支。
切换分支时,若目标分支不存在将会导致切换失败。使用 -b 参数可以创建一个新分支,在创建分支时还可以指定基于哪一个提交来创建新分支。使用 -b 参数创建并切换分支时,若分支已存在则会创建失败,并且不会切换到已存在的分支。
如执行git checkout -b dev2 89c49db将基于(89c49db)提交创建dev2分支。
-B 参数和 -b 参数相似,不同之处在于当分支已存在时,则会将其重置为
如执行git checkout -B dev2 89c49db将基于(89c49db)提交创建dev2分支,若dev2分支已存在,则会将其重置为(89c49db)提交。
本地创建的分支由于未设置上游追踪分支,因此,首次将新分支推送到远程时,不能直接使用git push命令,而应该使用git push
包含了路径工作区
对应的文件。
暂存区
的文件覆盖工作区
的文件。如果不省略,则使用工作区
的文件,同时暂存区
的文件也会被覆盖。下图展示了省略和不省略
为了避免路径和引用(或者提交ID)同名而发生冲突,可以在
应使用git checkout 分离头指针状态
”;
git checkout 检出命令默认值是暂存区,即从暂存区检出文件;
包含路径
.表示当前目录,git checkout .表示恢复当前目录所有文件。