【git】reset与checkout的区别

前言

git中,reset命令与checkout命令非常相似,都可以操作“工作区、暂存区、HEAD提交对象”,为与参考资料保持一致,本文称以上三个对象为“工作树、 索引树、HEAD对象”,树不是指数据结构,而是文件集合的意思。文章先记录reset命令的工作流程,然后比较reset与checkout命令。
 

reset命令

reset命令有两种调用方式,一种是以“提交对象”为操作粒度,另一种是以“文件路径”为操作粒度。两种层级的工作流程有些微的差异,先介绍“提交对象”粒度。
 

提交对象层级

在提交对象层级,git reset的调用方式为:

git reset [--mixed | --soft | --hard | --merge | --keep] [<commit>]
  • commit参数值默认为“HEAD”。
  • --mixed模式表示:“移动当前分支到HEAD所指向的提交对象,并将HEAD提交对象中的内容更新到索引树”,这是reset命令的默认模式。
  • --soft模式表示:“仅移动当前分支到HEAD所指向的提交对象”,但不更新索引树。
  • --hard模式表示:“不仅移动当前分支到HEAD所指向的提交对象,而且将HEAD对象的内容复制到索引树与工作树,注意该模式会覆盖工作区的内容。”

此时的工作流程为:“先更新HEAD的值,然后根据模式,即mixed、soft、hard的值,来更新索引树与工作树。”
在这里插入图片描述
如果需要修订最近一次提交,比如修订最近一次的提交信息,可以使用:

git reset --mixed HEAD~ 

“HEAD~”表示当前HEAD提交对象的父提交对象,也就是上一次提交对象,mixed选项指明git需将HEAD的值更新为上一次提交对象,并将上一次提交对象的内容更新到索引树中,此时直接提交,并附上新的提交信息就可以。
在这里插入图片描述

文件路径层级

当调用reset命令提供的是文件路径时:

git reset  <tree-ish> [--] <paths>

表明仅使git从<tree-ish>中复制内容,来更新索引树。此时git reset会自动跳过第一步,即不更新HEAD的值,而是直接将<tree-ish>中指定的文件复制出来。当不提供<tree-ish>时,就取默认HEAD值。
经过上面的操作,会得到:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

checkout命令

与reset命令相似,但有些许不同:

  • 提交对象层级:
    在这里插入图片描述
  • 文件路径层级
    可以修改工作树的内容,为reset提供文件路径时,只能修改索引树,但checkout不仅修改索引树,而且修改工作树
     

总结

下表汇总了reset与checkout命令在“提交对象”层级与“文件路径层级”,不同命令对HEAD、索引树、工作树的影响。HEAD列中HEAD指HEAD的值会改变,REF表示“refs/head/<branch-name>”。“WD Safe?”表示该命令是否会更改工作树的内容,即是否安全,该列的数值为“NO”时,使用前需考虑清楚
在这里插入图片描述
 

参考资料

  1. <<Progit>>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值