摘要:git checkout命令帮助我们实现如下的功能:创建分支,切换分支,撤销对当前工作目录下某些文件的修改,在两个分支和当前工作目录之间进行三路合并。本文主要为你讲解了git checkout的原理和几种使用情景以及示例。
本文来源:git checkout:从分支或者索引中检索文件到当前工作目录
http://blog.csdn.net/trochiluses/article/details/14519303
1.命令说明
git-checkout :检出一个分支或者路径到当前工作目录。
git-checkout - Checkout a branch or paths to the working tree
2.命令语法
git checkout [-q] [-f] [-m] [<branch>]
git checkout [-q] [-f] [-m] [--detach] [<commit>]
git checkout [-q] [-f] [-m] [[-b|-B|--orphan] <new_branch>] [<start_point>]
git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <paths>...
git checkout [-p|--patch] [<tree-ish>] [--] [<paths>...]
3.命令说明
3.1 -b选项
利用git checkout创建分支
注意,我们可以用git checkout -b创建一个分支,但是它仅仅是创建一个分支,并不会改变stage文件,也不会改变当前工作目录
3.2默认源文件和流程
git checkout 默认从index中检出文件到working dir.但是,需要注意,如果如果仅仅使用git reset 但是不指定文件名,那么git check将不进行任何操作。但是,这个操作会告诉你哪些文件发生了变化——但是并不会自动更改。我慢看一下git checkout的结果:
[huangyk@huangyk quickstart]$ git checkout
M lab.sh
M nat.sh
但是,git reset 就不同,如果不指定文件,将更改stage状态下的所有文件。
也就是说,git checkout的默认对象是空;git reset的默认对象是stage状态下的所有文件。从中我们可以看出,git对数据库和当前目录之下文件的保护更加严格
git checkout [<branch>], git checkout -b|-B <new_branch> [<start point>], git checkout [--detach] [<commit>]
注意:这种形式下,如果checkout的是一个新的分支,那么当前工作目录、索引都会被更新。
如果是当前分支,那么没有任何反应.
原理:命令会检查仓库和index是否一致,如果一致将不会继续进行后续操作。 所以,如果修改了某个文件,但是没有进入stage,此时我们反悔了,使用“git checkout”是没法达到目的的。
此时,可以使用如下的命令形式,从index中检出文件:
git checkout [-p|--patch] [<tree-ish>] [--] <pathspec>...
更新当前工作目录下的文件,使得它与index或者指定tree-ish(某一个commmit)下的文件相匹配。如果没有指定文件路径,命令将会同时更新HEAD,即切换当前分支。注意,如果没有指定文件,git checkout并不会用index中的文件来更新当前工作目录下的文件。
git checkout -m如果在分支onebranch下面已经有修改,而且没有提交,那么是不能用git checkout来转换分支的,此时,我们如果用-m选项,那么就会产生三路归并的效果:当前工作目录、当前分支、想要checkout的分支。如果merge产生冲突,索引条目将不会被更新,此时你需要手动进行冲突处理。另外,如果是从index中检出,-m选项将让你在指定的路径之下重新产生冲突的合并。
4.使用实例
1)将当前工作目录下的文件回退到,两次提交之前的版本,同时,误删了hello.c文件(如果是增加了一些文件,那么没法用这个方法解决),需要进行恢复
$ git checkout master (1)
$ git checkout master~2 Makefile (2)
$ rm -f hello.c
$ git checkout hello.c (3)
2)在错误的分支上进行了修改,现在需要转向正确的分支
$ git checkout mytopic
此时,我们往往会得到这样的输出:
如果修改没有被add进入index或者提交,将会得到提示信息:
error: Your local changes to the following files would be overwritten by checkout
此时,可以使用三路merge:
$ git checkout -m mytopic
3)利用git checkout创建分支
注意,我们可以用git checkout -b创建一个分支,但是它仅仅是创建一个分支,并不会改变stage文件,也不会改变当前工作目录