git reset --hard HEAD~1与git checkout .的区别是什么?
Git中
git reset --hard HEAD~1和git checkout .的作用与差异 一、两个命令的具体作用
1. git reset --hard HEAD~1
这个命令是彻底回滚分支状态,一次性完成三件事:
- 把当前分支的指针往回移动1个提交(
HEAD~1代表上一次提交的位置),相当于从分支历史里直接删掉了最后一次提交; - 清空暂存区,让暂存区内容和回退后的提交完全一致;
- 覆盖工作区所有文件,让工作区也和回退后的提交内容完全匹配。
简单说:它会抹掉最后一次提交,同时把你本地没提交的所有修改(不管是工作区还是暂存区的)全部删除——这些内容基本是永久丢失(没推送到远程的话,只能通过git reflog这类高级操作尝试找回提交记录,未提交的修改找不回来)。
2. git checkout .
这个命令是撤销工作区的本地修改,只针对工作区操作:
- 将工作区中所有已被Git跟踪的文件,恢复成和「暂存区当前内容」一致的状态;如果暂存区是空的(没有暂存任何修改),就恢复成和「当前HEAD提交」一致的状态。
简单说:它只改工作区,暂存区的内容不动,提交历史也完全没变化。比如你在工作区改了几个文件还没git add,用这个命令后,工作区的修改就没了;但如果已经git add到暂存区的内容,依然留在暂存区里,后续可以继续提交或者取消暂存。
二、核心差异对比
- 操作范围不同
git reset --hard HEAD~1:同时修改提交历史、暂存区、工作区,是全链路的彻底回滚git checkout .:只修改工作区,暂存区和提交历史完全不受影响
- 对提交历史的影响
- 前者会直接删除当前分支的最后一次本地提交,分支历史会被缩短
- 后者完全不碰提交记录,所有之前的提交都原封不动
- 未提交修改的处理
- 前者会清空工作区+暂存区的所有未提交修改,这些内容直接丢失
- 后者只撤销工作区的修改,暂存区的修改依然保留,你可以自主选择后续操作
- 恢复难度
- 前者的提交记录需要用
git reflog查找恢复,未提交修改无法恢复 - 后者的工作区修改如果刚被撤销,可能还有机会找回,且暂存区内容不受影响,风险小很多
- 前者的提交记录需要用
内容的提问来源于stack exchange,提问作者Juan Fruto
相关产品推荐
相关产品推荐

