git reset --soft,--hard的区别

git reset --soft,--hard的区别

git reset 命令可以将当前的HEAD重置到特定的状态。
首先要搞清楚下面几个概念

  • HEAD: HEAD就是指向当前分支当前版本的游标
  • Index: Index即为暂存区,当你修改了你的git仓库里的一个文件时,这些变化一开始是unstaged状态,为了提交这些修改,你需要使用git add把它加入到index,使它成为staged状态。当你提交一个commit时,index里面的修改被提交。
  • working tree: 即当前的工作目录。

git reset 的用法
git reset [<mode>] [<commit>]
git reset 将当前分支的HEAD指向给定的版本,并根据模式的不同决定是否修改index和working tree。
常用的有三种模式,--soft, --mixed, --hard,如果没有给出<mode>则默认是--mixed

--soft

使用--soft参数将会仅仅重置HEAD到制定的版本,不会修改index和working tree

38d65dd (HEAD -> master) Third commit
6bf8706 Second commit
093ceb0 First commit

例如当前分支现在有三次提交,执行git reset --soft HEAD~之后,查看git log

6bf8706 (HEAD -> master) Second commit
093ceb0 First commit

而本地文件的内容并没有发生变化,而index中仍然有最近一次提交的修改,这时执行git status会显示这些修改已经在再暂存区中了,无需再一次执行git add


--mixed

使用--mixed参数与--soft的不同之处在于,--mixed修改了index,使其与第二个版本匹配。index中给定commit之后的修改被unstaged。



如果现在执行git commit 将不会发生任何事,因为暂存区中没有修改,在提交之前需要再次执行git add

--hard

使用--hard同时也会修改working tree,也就是当前的工作目录,如果我们执行git reset --hard HEAD~,那么最后一次提交的修改,包括本地文件的修改都会被清楚,彻底还原到上一次提交的状态且无法找回。所以在执行reset --hard之前一定要小心

git revert

使用git revert也能起到回退版本的作用,不同之处在于

  • git revert <commit>会回退到<commit>之前的那次提交,比如git revert HEAD~3会回退到最近的第4个提交的状态,而不是第3个
  • git revert会产生一个新的commit,将这次回退作为一次修改记录提交,这样的好处是不修改历史提交记录。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容