git reset vs git revert
1.前言
在团队开发中,使用 Git 作为版本开发工具,可以便捷地协同多人管理并行开发,但是由于自己或者其他人代码提交污染了远程分支,就需要对远程代码进行恢复操作,Git 提供了reset
和revert
两种命令来进行恢复操作,这两种操作效果是截然不同的,不太清楚这个原理的同学需要了解一下,以免在实际的开发过程中翻车,导致线上远程仓库不可逆转的操作。
首先从英文释义来讲,reset
是重置的意思,revert
是恢复、还原的意思。
2.背景
Git 的每一次提交都是一次commit,上图可以看到在时间线上有三次提交,此时HEAD
指向main
分支,main
分支又指向最新的Commit3
。
HEAD
是指向当前分支的最新提交的指针,可以在任意分支进行切换;
main(master)
分支,是一个git代码仓库的主分支也是默认分支;
commit
每一次提交代码都会产生一个commit id
来标识工作区的变更与改动。
3.git reset
在github上创建一个空白的仓库,按照上图创建三次提交:
git reset
的作用是将HEAD
指向指定的版本上去:
使用git log
查看提交记录:
这里可以看到我们提交了三次记录,我们现在想恢复到第一次commit 提交的时候。
使用git reset --hard
命令操作:
此时我们可以看到已经恢复到了第一次提交代码的时候,目前我们是使用git reset --hard
的方式,其实这里存在着三种方式,详情见我写的文章https://blog.csdn.net/fageaaa/article/details/146107438中的第10条。
这时候我们只是讲本地的 HEAD 指向了main 分支的 commit 1,但是远程并没有变更,此时需要强行推一下就可以了。
git push -f
此时我们可以看到远程也没有了,我们之前提交的三次记录而是只有第一次的提交记录。
在团队合作的共同操作一个仓库的时候, git reset 命令一定要慎重使用,在使用的时候一定要再三确认其他同学的代码是否会被重置操作而导致代码丢失,导致一些提交记录的丢失,这些都是不可逆的,一定要慎重
。
4.git revert
git revert
是用来重做某一个commit 提交的内容,在我们原始的提交之中,我们会发现分支上面有创建了一个新的 commit 提交,而此时我们对于想重做的某个 commit 提交的内容都不存在了:
在github上创建一个空白的仓库,按照上图创建三次提交:
执行命令
git revert 8a189dc468ff360902238fb75858a5f520e57499
按:wq
退出保存,再次git log
:
可以看到111
提交记录中的index1.txt
文件已经被删除了。但此时有4条提交记录。
然后强制提交到远程:
5.总结
git reset
和git revert
都是属于重新恢复工作区以及远程提交的方式,但这两种操作有着截然不同的结果:
git reset
是将之前的提交记录全部抹去,将HEAD
指向自己重置的提交记录,对应的提交记录都不复存在;git revert
操作是将选择的某一次提交记录重做,若之后又有提交,提交记录还存在,只是将指定提交的代码给清除掉。