git reset、git revert用法和区别

67 阅读2分钟

前言

git resetgit revet两个git命令都是用于撤销提交,那么它们有什么区别呢?本文将为你详解

git 工作流中的三棵树

image.png

  • 工作目录 这个一般就是我们写代码的地方,比如你的 vscode 打开的项目,你可以进行代码编辑的地方。
  • 暂存区 这个区域就是我们每次执行 git add 之后会存到的区域,用来与本地仓库之间做一个缓存,同时也是 Git 底层设计上来说也算是比较重要的一个区域,它能帮助 Git 在做 diff 的时候提高查找性能。
  • HEAD 这个区域总是指向当前分支最后一次。

在我们检出代码之后,在没有任何修改的时候,这三棵树是一样的。

git reset三种常用模式(soft、mixed、hard)的用法

git reset 命令有如下几种方式

git reset <commit-id>
git reset <branch-name>
git reset <tag-name>
git reset HEAD~<n>

接下来来看三种常用模式(soft、mixed、hard)的用法,假设有一个三次提交的记录分支

image.png

soft
git reset --soft HEAD~1

只会重置HEAD

image.png

mixed git reset --mixed HEAD~1

会重置HEAD和暂存区

image.png

hard

git reset --hard HEAD~1

会重置HEAD、暂存区和工作目录

image.png

git revert

git revert 命令用于创建一个新的提交,该提交包含了要回滚的提交所引入的更改的相反操作,这样就可以撤销这些更改。这个新提交将成为项目历史记录中的一部分,并且需要被推送到远程仓库以应用这些更改。相较于 git reset 命令,git revert 命令更加安全,因为它不会删除任何提交,而是创建新的提交(如果想完全撤销更改,需要使用 git reset 命令。)。该命令通常用于回滚已经推送到远程仓库的提交

总结

git reset会改变提交历史,建议不要在公共分支使用,如果在公共分支撤销提交可以使用git revert,它会保留记录。 hard模式不仅会丢失已提交的改动,还可能丢失本地未提交的改动,要慎重使用。