【微知】git reset --soft --hard以及不加的区别?

[复制链接]
发表于 2025-9-20 21:38:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
配景

在 Git 里,git reset 是用来将当前的 HEAD 复位到指定状态的下令。--soft、--hard 是它的两个常用选项,本文简单先容他们的区别,以及不添加选项时的默认情况。
在 Git 里,HEAD 是一个紧张的引用,它指向当前地点的分支大概提交。# 检察当前HEAD指向的分支 git symbolic-ref HEAD。  雷同C语言的指针,只是HEAD指向的是某个提交,大概git内里的obj。大概blob。
快速追念(逐级增长)

–hard会将暂存区和工作区都清空,强制将工作空间配置到某个提交。具体根据HEAD~x来决定
–mixed(默认,不加soft和hard)暂存区回退到工作区,工作区原来的未便。提交区到暂存区的根据HEAD~x来决定
–soft 只有HEAD~x才回退,其他都稳定
其他:

  • –soft:仅移动 HEAD,暂存区和工作区稳定。(都不影响)
  • 默认(–mixed):移动 HEAD,重置暂存区,工作区稳定。(影响暂存区)
  • –hard:移动 HEAD,同时重置暂存区和工作区。(都影响)
    可以用HEAD不-1来明确。
其他快速用法:

  • 完全进入commit -1的代码版本:git reset --hard HEAD~1,会减少comimt区,清空暂存区,清空工作区。将本地完全回退到HEAD~1的状态
  • 取消最新的commit到暂存区:git reset --soft HEAD~1
其他影象点:

  • HEAD 影响提交区的指针是否变革
  • –soft不改变暂存区和工作区原来的,如果指定HEAD会把HEAD回退到暂存区,然后–soft不影响
  • –mixed(默认)会回退暂存区到工作区,原来工作区稳定
  • –hard 如果指定HEAD,会“先”回退commit到暂存区,然后回退暂存区到工作区,然后清空工作区。(可以简单明确为直接规复到指定的commit上,其他全部清场)。
细节

git reset --soft

利用 git reset --soft 时,HEAD 会被移动到指定的提交,不外工作区和暂存区的内容不会改变。可以重新提交之前的修改。
举例:
  1. git reset --soft HEAD~1 #HEAD 回退一个提交,但是暂存区和工作区的内容不变,可重新提交之前的修改。
复制代码
其他:git reset --soft HEAD 没有任何修改,HEAD指针没有-1以是HEAD稳定,soft不影响暂存区,也不影响工作区
不添加选项的默认情况

如果在利用 git reset 时不添加选项,默认是 --mixed 模式。--mixed 会让 HEAD 移动到指定的提交,暂存区的内容会被重置为指定提交时的状态,工作区的内容稳定。可以重新选择要提交的修改。
举例:
  1. git reset HEAD~1 #HEAD 回退一个提交,暂存区的内容会被重置为前一个提交时的状态,但是工作区的内容不变,可以重新选择要提交的修改。
复制代码
其他:git reset HEAD 这里HEAD指针没有-1以是HEAD稳定,不影响暂存区,也不影响工作区。相当于git clean -xdf
git reset --hard

git reset --hard 会让 HEAD 移动到指定的提交,同时工作区和暂存区的内容也会被重置为指定提交时的状态。尚未提交的修改都会丢失。
举例:
  1. git reset --hard HEAD~1 #让 HEAD 回退一个提交,并且工作区和暂存区的内容会被重置为前一个提交时的状态,所有未提交的修改都会丢失。
复制代码
其他:git reset --hard HEAD 这里HEAD指针没有-1以是HEAD稳定,hard影响暂存区,也影响工作区。
实验

mixed


hard


总结


  • --soft:仅移动 HEAD,暂存区(git add的东西还在)和工作区稳定。
  • 默认(--mixed):移动 HEAD,重置暂存区(git add的东西不在),工作区稳定。以是常用这个git reset HEAD~1 来将暂存区的回退
  • --hard:移动 HEAD,同时重置暂存区和工作区。
在利用 git reset 尤其是 --hard 时要格外审慎,由于它大概会导致未提交的修改丢失。
为了便于明确,reset的本质是修改3个条理,用HEAD稳定来看:

  • 条理1:什么都不影响,git reset --soft HEAD  这里HEAD的值稳定;
  • 条理2:清空暂存区,回退到工作区, git reset HEAD  会把暂存区的放到工作区,HEAD的值稳定;
  • 条理3:影响暂存区,工作区; git reset --hard HEAD  这里会把暂存区的清空,工作区回退(但是注意工作区回退只影响git管理的文件不会影响原来git没有的文件),HEAD的值稳定;
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表