git checkout 检出
在git reset的用法中,我们了解到,git reset 主要是对用“游标”(也可以理解成我们具体的分支名)的改动,而HEAD指向并没有改变。而git checkout
命令则是改变 HEAD 的指向。
git checkout commit-id 实现“分离头指针”
xing@ubuntu-15-121:~/work/GitTest/HelloWorld$ git rev-parse HEAD master
3de57a56ac0c2721d568538a6c728b546b8cf442
3de57a56ac0c2721d568538a6c728b546b8cf442
上面是我们打印出的HEAD 和master 指向的 commit-id,可以看到 HEAD 和 master指向的 commit-id是一样的。这很容易理解,打印出 HEAD 的内容就知道了。
xing@ubuntu-15-121:~/work/GitTest/HelloWorld$ cat .git/HEAD
ref: refs/heads/master
HEAD是指向master的,如果我们此时进行这样的操作,运行以下的命令 git checkout 3de57
,此时会打印出以下的log.
xing@ubuntu-15-121:~/work/GitTest/HelloWorld$ git checkout 3de57
M 1
Note: checking out '3de57'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b new_branch_name
HEAD is now at 3de57a5... add third line
我们再cat出HEAD文件的内容,可以看到:
xing@ubuntu-15-121:~/work/GitTest/HelloWorld$ cat .git/HEAD
3de57a56ac0c2721d568538a6c728b546b8cf442
这个时候HEAD的内容改变了,虽然指向的仍然是master的那个commit-id,但是和master已经没什么关系。此时的状态就是”detached HEAD” state,也就是所说的”分离头指针”。
想象一下,我们在一个分支上开发功能,如果我们想回到之前的某个修改点并且试验一下新的功能,则可以使用
git checkout <commit-id>
回到指定的修改点,然后再使用git checkout -b new_branch
创建一个新的分支,再在这个分支上开发试验的功能。当然也可以使用git stash
命令,这个以后再研究,或者通过下面的checkout的方法。
需要注意的是“分离头指针”状态下的提交在我们切换分支后还是会存在于版本库中,但是并不能保证这个提交会永久存在。当reflog中含有该提交的日志过期后,这个提交随时都会从版本库中彻底消除。
使用git merge 将“分离头指针”模式下的修改合并到指定分支
- 首先使用
git checkout <指定分支>
切换到要合并到的分支 - 再使用
git merge commit-id
将指定的commit-id合并到当前的分支
git checkout 命令的三种用法
git checkout [-q] [<commit>] [ – ] <paths>…
这种用法不会改变HEAD的头指针,commit为可选项,如果省略则相当于从暂存区进行检出,重置(reset)的默认值是 HEAD,而检出的默认值是暂存区。– 是为了避免路径和引用同名而发生冲突。
git checkout []
会改变HEAD的头指针
git checkout [-m] [ [-b] –orphan <new_branch> ] [<start_point>]
这种用法主要是创建和切换到新的分支,新的分支从指定的提交开始创建。