• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • git checkout

    git checkout:切换分支或恢复工作树文件。git checkout命令会重写工作区,所以也是一个很危险的命令。

    git checkout更新工作树中的文件,以匹配索引或指定树中的版本。如果没有给出路径,git checkout也将更新HEAD以将指定的分支设置为当前分支。git checkout的本质是签出指定的 commit ,所以你不止可以切换 branch ,也可以直接指定 commit 作为参数,来把 HEAD 移动到指定的 commit 。

    git checkout HEAD^^
    git checkout master~5
    git checkout 78a4bc
    git checkout 78a4bc^
    

    git checkout命令用于更新工作区的文件使它们和指定提交或暂存区保持一致,也就是会从指定提交(或者暂存区)中拷贝文件到工作区替换掉原有的文件,也可用于切换分支(切换分支的同时也会更新工作区和暂存区的文件)。


    更新文件

    更新工作区的指定文件,使它和暂存区保持一致:

    git checkout -- file
    

    这个命令也就是撤销工作区对文件的修改。--选项的作用是表明其后的内容是目录或文件,而不是分支名,避免有文件名和分支名一样而出错的情况,因为git checkout后面直接加分支名就成了切换分支了,在保证不会混淆的情况下,可以直接使用以下命令:

    git checkout file
    


    同时更新工作区和暂存区的指定文件,使它和指定提交保持一致:

    git checkout commit file
    

    比如将提交设为HEAD

    git checkout HEAD file
    

    这个命令更新工作区和暂存区的指定文件,使它和当前提交保持一致,也就是会把工作区和暂存区中对该文件的修改全部撤销,恢复到上一次git commit后的状态。


    file还可以是目录,还可以是匹配多个文件名的模式,比如*.py匹配所有以.py结尾的文件。


    更新当前目录(和子目录)的所有文件,使它们和暂存区保持一致:

    git checkout .
    

    也就是撤销当前目录中的所有修改,包括删除的文件,但是未跟踪的文件不受影响。


    更新当前目录(和子目录)和对应的暂存区的所有文件,使它们和当前提交保持一致:

    git checkout HEAD .
    

    也就是撤销当前目录和对应暂存区中的所有修改,同样未跟踪文件不受影响。

    上面这两个命令只是针对执行命令时所处的目录起作用,因为.(句点)在 shell 中代表当前目录,比如在工作区子目录下执行这两个命令,就只会对这个子目录(和子目录的子目录)起作用,并不会影响到工作区的其它文件。


    切换分支

    如果给git checkout命令指定分支名作为参数,那么就可以用来切换分支:

    git checkout branch
    

    这个命令切换到指定分支,并将暂存区和工作区的文件更新到和该分支的最新提交一致,但是如果当前工作区或暂存区还有修改没有提交,那么这个命令会失败。切换分支后HEAD将指向对应的分支名,而该分支名指向它的最新提交(分支名实际上是一个指向它的最新提交的指针)


    切换到分支的游离状态,默认以该分支下的最后一次提交 ID。

    git checkout --detach master
    

    HEAD就会切换到 master 的最后一次 commit 值的状态下。


    创建新分支并切换到新分支

    git checkout [-q] [-f] [-m] [[-b|-B|--orphan] <new_branch>] [<start_point>]
    

    根据当前分支,创建新分支,并切换到新分支

    在通常情况下,我们都会在当前分支的基础上,创建新分支。比如git branch -b new_branch

    通常情况下,你会更希望立即切换到新分支,从而在该分支中操作,然后当此分支的开发日趋稳定时,将它合并到稳定版本的 master 分支中去。

    git branch newbranch
    git checkout newbranch
    

    Git 还为你提供了快捷方式:git checkout -b newbranch

    git branch
    * master
    
    ls
    README   hello.rb more.txt test.txt
    
    
    git checkout -b removals
    Switched to a new branch 'removals'
    
    git rm more.txt 
    rm 'more.txt'
    
    git rm test.txt 
    rm 'test.txt'
    ls
    README   hello.rb
    
    git commit -am 'removed useless files'
    [removals 8f7c949] removed useless files
     2 files changed, 0 insertions(+), 2 deletions(-)
     delete mode 100644 more.txt
     delete mode 100644 test.txt
    
    git checkout master
    Switched to branch 'master'
    ls
    README   hello.rb more.txt test.txt
    

    如你所见,我们创建了一个分支,在该分支的上下文中移除了一些文件,然后切换回我们的主分支,那些文件又回来了。使用分支将工作切分开来,从而让我们能够在不同上下文中做事,并来回切换。

    创建新分支,在其中完成一部分工作,完成之后将它合并到主分支并删除。你会觉得这很方便,因为这么做很快很容易。如此,当你觉得这部分工作并不靠谱,舍弃它很容易。并且,如果你必须回到稳定分支做些事情,也可以很方便地这个独立分支的工作先丢在一边,完成要事之后再切换回来。


    -B选项的特殊之处在于如果要创建的分支已经存在,那么会把该分支重置到指定的start-point上,而-b选项则无法创建,会提示分支已经存在。


    在当前提交新建分支,并设置跟踪指定的远程分支。

    git checkout -b new_branch --track remote/branch
    


    根据分支最后提交,创建新分支,并切换到新分支

    我们还可以基于当前分支的某一次 commit 来创建分支。

    git checkout -b new_branch [start-point]
    

    当然,也可以省略-b参数:

    git checkout new_branch [start-point]
    


    创建空白分支并且切换到新分支

    git checkout --orphan newbranch  [start-point]
    

    git checkout --orphan创建名为newbranch的新分支,从start-point开始并切换到该分支。在这个新分支上进行的第一次提交将没有父母,它将成为与所有其他分支和提交完全断开连接的新历史记录的根。

    在非新存储库上以类似git init的状态创建分支。Git 允许您将多个独立项目作为单个存储库中的不同分支进行跟踪。

    git checkout --orphan dev
    

    这个命令会生成一个叫 dev 的分支,该分支会包含父分支的所有文件。但新的分支不会指向任何以前的提交,就是它没有历史,如果你提交当前内容,那么这次提交就是这个分支的首次提交。

    上篇:git branch

    下篇:git merge