git checkout
git checkout
:切换分支或恢复工作树文件。git checkout
命令会重写工作区,所以也是一个很危险的命令。
git checkout
更新工作树中的文件,以匹配索引或指定树中的版本。如果没有给出路径,git checkout
也将更新HEAD以将指定的分支设置为当前分支。git checkout
的本质是签出指定的 commit ,所以你不止可以切换 branch ,也可以直接指定 commit 作为参数,来把 HEAD 移动到指定的 commit 。
git checkout HEAD^^git checkout master~5git checkout 78a4bcgit 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 newbranchgit checkout newbranch
Git 还为你提供了快捷方式:git checkout -b newbranch
。
git branch * masterls README hello.rb more.txt test.txtgit checkout -b removals Switched to a new branch 'removals'git rm more.txtrm 'more.txt'git rm test.txtrm 'test.txt'ls README hello.rbgit 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.txtgit 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 的分支,该分支会包含父分支的所有文件。但新的分支不会指向任何以前的提交,就是它没有历史,如果你提交当前内容,那么这次提交就是这个分支的首次提交。