git checkout 检出命令——自由切换分支&恢复文件

命令简介

  git checkout 命令主要有两大用途——切换分支和恢复文件。

HEAD

  HEAD是一个“头指针”,其所引用的提交作将为一个“基础版本”,当执行提交操作时 ,HEAD指向的提交将作为新提交的父提交。
  .git/HEAD文件的内容就是HEAD的指向,该内容通常是一个分支引用(分支游标)。如下图所示,HEAD当前指向main分支游标,refs/heads/main是main分支的全称,即main是refs/heads/main的缩写。

在这里插入图片描述

git checkout <branch> 切换分支

在这里插入图片描述

  git checkout <branch>命令执行上图中的全部操作1、2、3,即:

  1、更新HEAD以指向<branch>分支。

  2、用<branch>指向的树对象更新暂存区。

  3、用<branch>指向的树对象更新工作区。

  注意:参数写作<branch>是因为只有HEAD切换到一个分支才可以对提交进行跟踪,否则会进入“分离头指针状态”。

  在上图例子中,执行如下命令可以切换至已存在的dev分支。

$ git checkout dev

  执行结果如下图所示,HEAD被更新为指向dev分支,暂存区和工作区中的文件被重置为跟dev分支的最新提交——(2233b28)提交中的文件一致。
在这里插入图片描述
  注意:由于检出命令会重置暂存区和工作区,因此,如果工作区或暂存区存在未提交的改动,切换将会失败,此时有两种选择。

  第一种做法是提交改动,先使用git add .添加改动到索引(暂存区)以准备提交,并使用git commit -m "提交说明"执行一次提交,然后再切换分支。

  第二种做法是丢弃改动,先使用git reset --hard撤销暂存区和工作区的改动,并使用git clean -dxf清理新增文件和文件夹,然后再切换分支。

  还有另一种丢弃改动的做法是使用 -f 参数进行强制切换,即执行git checkout -f <branch>忽略工作区和暂存区的改动强制进行切换,然后再使用git clean -dxf清理新增文件和文件夹。

进阶:git checkout [-f] [-b | -B] <branch> [<start_point>] 创建和切换分支

-f 参数——强制切换

  当暂存区或工作区存在未提交的改动时,将无法执行checkout命令。使用 -f 参数可以丢弃暂存区和工作区的改动,强制执行checkout命令。

  如执行git checkout -f dev将强制切换至dev分支。

-b 参数——创建并切换分支

  切换分支时,若目标分支不存在将会导致切换失败。使用 -b 参数可以创建一个新分支,在创建分支时还可以指定基于哪一个提交来创建新分支。使用 -b 参数创建并切换分支时,若分支已存在则会创建失败,并且不会切换到已存在的分支。

  如执行git checkout -b dev2 89c49db将基于(89c49db)提交创建dev2分支。

-B 参数——创建/重置并切换分支

  -B 参数和 -b 参数相似,不同之处在于当分支已存在时,则会将其重置为<start_point>

  如执行git checkout -B dev2 89c49db将基于(89c49db)提交创建dev2分支,若dev2分支已存在,则会将其重置为(89c49db)提交。

提示

  本地创建的分支由于未设置上游追踪分支,因此,首次将新分支推送到远程时,不能直接使用git push命令,而应该使用git push <remote> <branch>命令,明确指定要推送的的远程仓库和远程分支名。分支推送过一次远程之后,就会和远程建立追踪关系,下次推送就可以直接使用git push命令了。

再进阶:git checkout [<commit>] [--] <paths> 恢复文件

  包含了路径<paths>的用法不会改变HEAD头指针,主要是用于指定版本的文件覆盖工作区对应的文件。

  <commit>可以省略,如果省略则会用暂存区的文件覆盖工作区的文件。如果不省略,则使用<commit>指定的提交覆盖工作区的文件,同时暂存区的文件也会被覆盖。下图展示了省略和不省略<commit>时的区别。

在这里插入图片描述

  <paths>路径指定要覆盖的范围,也可以使用文件名来指定要覆盖的文件,还可以同时指定多个路径和文件名,使用空格作为分隔符。

  为了避免路径和引用(或者提交ID)同名而发生冲突,可以在<paths>前用两个连续的短线--(减号)作为分隔。

总结

  应使用git checkout <branch>而不使用git checkout <commit>以避免进入“分离头指针状态”;

  git checkout 检出命令默认值是暂存区,即从暂存区检出文件;

  包含路径<paths>的用法只会恢复文件,不会改变HEAD头指针;

  .表示当前目录,git checkout .表示恢复当前目录所有文件。

猜你喜欢

转载自blog.csdn.net/weixin_44567318/article/details/110099081