在实际应用中,git checkout是最为常见命令之一。
此命令参数众多,功能多样,但有些功能可能整个职业生涯都不会用到,所以本文只介绍最为实用的部分。
$ git checkout --help
众多教程将此命令翻译成"检出",比如检出某分支。
由于本人英文水平有限(良心话)不能理解它的含义,当然这也不是我们所深究的重点。
作用综述如下:
(1).切换或者新建分支。
(2).将暂存区或者指定commit内容覆盖到工作区。
此命令总体功能大致上述两条,当然由于参数的不同,功能在细节上会有所不同。
首先查看一下当前项目的分支:
$ git branch
代码运行效果截图如下:
$ git checkout master
可以看到现在已经切换到master分支。
默认状态下,新建分支并不能自动切换到此新分支下,代码如下:
git branch newBr
新建newBr分支,但默认不会切换到此分支,图示如下:
$ git checkout -b newBr2
上述代码实现新建newBr2分支,并切换到此分支。
(1).用暂存区内容覆盖工作区内容:
当前工作区readme.txt文件的内容如下:
蚂蚁部落一
蚂蚁部落二
蚂蚁部落三
下面再添加一行:
蚂蚁部落一
蚂蚁部落二
蚂蚁部落三
蚂蚁部落四
将其提交到暂存区,代码如下:
$ git add readme.txt
再给工作区readme.txt文件添加一行:
蚂蚁部落一
蚂蚁部落二
蚂蚁部落三
蚂蚁部落四
蚂蚁部落五
现在后悔了,想要将暂存区内容恢复到工作区,代码如下:
$ git checkout readme.txt
以上代码可以将暂存区中的readme.txt文件还原到工作区,如果要还原多个文件,那么使用空格分隔:
$ git checkout readme.txt antzone.txt
如果要还原所有文件,checkout后面跟点即可(.):
$ git checkout .
特别说明:如果checkout后面是文件名称,以下写法更为稳妥:
$ git checkout -- readme.txt
文件名称前面有两个横杠,并且中间采用空格分隔(否则报错)。此种方式可以防止Git出现误判,加入暂存区有一个文件名为ant(没有后缀名),恰好当前项目也有有个名为ant的分支,这个时候Git会优先将ant当做分支处理,于是就有可能导致错误。
(2).用指定commit提交的内容覆盖工作区:
当前工作区readme.txt文档的内容是:
蚂蚁部落一
蚂蚁部落二
蚂蚁部落三
蚂蚁部落四
再来看一下提交历史,代码如下:
$ git log --oneline
运行效果截图如下:
$ git checkout 6c89271 -- readme.txt
代码运行后,工作区readme.txt文档内容变为:
蚂蚁部落一
checkout后面的参数没必要非要是sha-1值,只要能够唯一标识指定提交即可,也可以采用如下形式:
$ git checkout HEAD^^ -- readme.txt
我们也可以将其他分支的指定提交内容还原到当前分支工作区,首先做一下说明:
$ git checkout master
checkout后面仅仅跟着分支名称,那么它的功能是切换分支。
$ git checkout Develop -- readme.txt
如果分支后面跟着文件路径,那么就是将对应分支中的文件还原到当前分支的工作区。
下面举个例子,当前我们在master分支,readme.txt文档内容为:
蚂蚁部落一
蚂蚁部落二
蚂蚁部落三
现在我们用Develop分支的指定commit提交的文件来覆盖master分支工作区:
$ git checkout Develop -- readme.txt