前言
git reset
、git revet
两个git命令都是用于撤销提交,那么它们有什么区别呢?本文将为你详解
git 工作流中的三棵树
工作目录
这个一般就是我们写代码的地方,比如你的 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)的用法,假设有一个三次提交的记录分支
soft
git reset --soft HEAD~1
只会重置HEAD
mixed
git reset --mixed HEAD~1
会重置HEAD和暂存区
hard
git reset --hard HEAD~1
会重置HEAD、暂存区和工作目录
git revert
git revert
命令用于创建一个新的提交,该提交包含了要回滚的提交所引入的更改的相反操作,这样就可以撤销这些更改。这个新提交将成为项目历史记录中的一部分,并且需要被推送到远程仓库以应用这些更改。相较于 git reset
命令,git revert
命令更加安全,因为它不会删除任何提交,而是创建新的提交(如果想完全撤销更改,需要使用 git reset
命令。)。该命令通常用于回滚已经推送到远程仓库的提交。
总结
git reset会改变提交历史,建议不要在公共分支使用,如果在公共分支撤销提交可以使用git revert,它会保留记录。 hard模式不仅会丢失已提交的改动,还可能丢失本地未提交的改动,要慎重使用。