git 笔记记录(六) git检出

本文详细介绍了Git的`git checkout`命令,包括如何从暂存区或特定提交检出文件,切换分支,创建新分支,以及如何用暂存区或分支文件覆盖工作区中的文件。通过这些操作,你可以有效地管理你的Git工作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      1.上一节讲了重置命令,重置命令是修改了引用的游标指向,重置命令所针对的是头指针HEAD,之所以没有修改HEAD内容,是因为HEAD指向了一个引用refs/heads/master,所以重置命令体现为分支游标的变更,HEAD本身一直指向的是refs/heads/master,并没有在重置时改变.
     2.而检出命令(git checkout)的实质是修改HEAD本身的指向,该命令不会影响分支.

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

bluceshang@bluceshang:~/gittemp$ cat .git/HEAD
ref: refs/heads/master
bluceshang@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 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 0d61bf3... does master follow this new commit?
可以看出现在处于"分离头指针"状态,什么叫分离头指针状态,看看HEAD就知道了.此时的HEAD指向了一个具体的提交ID而不是一个分支,此时HEAD的头指针被改变了,由指向master分支变成了一个指向的ID

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

bluceshang@bluceshang:~/gittemp$ git rev-parse HEAD master
0d61bf3576df85a228b90d421f2410b73d6d9fed
3dad65fc13072062f5edd94f73990788f0968d8a
此时处于头指针分离状态,所作的修改不能被任何一个分支所跟踪,因此不能保证所作的提交会永久保存,当reflog中含有该日志过期后,这个提交随时都会从版本被中清除.挽救的办法是将分禽状态的提交merge到master中来.
bluceshang@bluceshang:~/gittemp$ git checkout master
bluceshang@bluceshang:~/gittemp$ git merge e39623e
bluceshang@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  .

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








评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值