git 笔记记录(六) git检出

来源:互联网 发布:我的世界手机版家具js 编辑:程序博客网 时间:2024/05/06 08:10
      1.上一节讲了重置命令,重置命令是修改了引用的游标指向,重置命令所针对的是头指针HEAD,之所以没有修改HEAD内容,是因为HEAD指向了一个引用refs/heads/master,所以重置命令体现为分支游标的变更,HEAD本身一直指向的是refs/heads/master,并没有在重置时改变.
     2.而检出命令(git checkout)的实质是修改HEAD本身的指向,该命令不会影响分支.

     3.HEAD是当前工作区的"基础版本",当执行提交时,HEAD指向的提交作为新提交的父提交.

bluceshang@bluceshang:~/gittemp$ cat .git/HEADref: refs/heads/masterbluceshang@bluceshang:~/gittemp$ git branch -v* master 3dad65f test reset amend
可以看出当前处于master分支.现在使用git checkout.

bluceshang@bluceshang:~/gittemp$ git checkout 3dad65f^Note: checking out '3dad65f^'.You are in 'detached HEAD' state. You can look around, make experimentalchanges and commit them, and you can discard any commits you make in thisstate without impacting any branches by performing another checkout.If you want to create a new branch to retain commits you create, you maydo so (now or later) by using -b with the checkout command again. Example:  git checkout -b new_branch_nameHEAD is now at 0d61bf3... does master follow this new commit?
可以看出现在处于"分离头指针"状态,什么叫分离头指针状态,看看HEAD就知道了.此时的HEAD指向了一个具体的提交ID而不是一个分支,此时HEAD的头指针被改变了,由指向master分支变成了一个指向的ID

bluceshang@bluceshang:~/gittemp$ cat .git/HEAD0d61bf3576df85a228b90d421f2410b73d6d9fed
  可以看出master与HEAD已经不一样了.

bluceshang@bluceshang:~/gittemp$ git rev-parse HEAD master0d61bf3576df85a228b90d421f2410b73d6d9fed3dad65fc13072062f5edd94f73990788f0968d8a
此时处于头指针分离状态,所作的修改不能被任何一个分支所跟踪,因此不能保证所作的提交会永久保存,当reflog中含有该日志过期后,这个提交随时都会从版本被中清除.挽救的办法是将分禽状态的提交merge到master中来.
bluceshang@bluceshang:~/gittemp$ git checkout masterbluceshang@bluceshang:~/gittemp$ git merge e39623ebluceshang@bluceshang:~/gittemp$ git log --graph --oneline*   3807484 Merge commit 'e39623e'|\  | * e39623e commit in detached HEAD mode* | 3dad65f test reset amend|/  * 0d61bf3 does master follow this new commit?* d7b6764 add file* 66ae14e modify welcome* 15c643c Append a nice line.* e213c85 change author* d4e260e first commit
此时可以看到我们已经通过merge合并到master中来了.


git checkout命令的详细用法

一:git checkout [-q] [<commit>[--] <paths>...]

二:git checkout [<branch>]

三:git checkout [-m] [[--b]--orphan]  <new_branch> [<start_point>]

第一种用法<commit>是可选项,省略则相当于从暂存区进行检出,与reset 命令不同,reset默认是HEAD,而checkout的默认是暂存区.因此重置一般是用于暂存区,而检出一般是用于覆盖工作区.这种用法不会修改HEAD指针,主要用于版本的文件覆盖工作区中的文件,如果省略<commit>则会用暂存区的文件覆盖工作区中的文件,否则会用指定提交中的文件覆盖工作区与暂存区中的文件.

第二种用法是切换分支.如果没有<branch>会进入头指针分离状态.

第三种用法是创建和切换到新的分支中,新的分支从<start_point>指定的提交开始创建.

git  checkout  branch

      检出branch分支,要完成上图中的三个步骤,更新HEAD以指向branch以及用branch指向的树更新暂存区与工作区.

git  checkout

        汇总显示工作区,暂存区与HEAD的差异

git  checkout  --  filename

        用暂存区中filename文件来覆盖工作区中的filename文件,相当于取消上次执行git  add  filename以来的本地修改.

git  checkout  branch  --   filename  

       维持HEAD的指向不变,会用branch所指向的提交中的filename替换暂存区和工作区中相应的文件.会直接将暂存区与工作区中的filename文件直接覆盖.

git  checkout  -- .或git checkout  .

       "."会取消所有本地的修改,会用暂存区中所有文件直接覆盖本地文件.