- 1 简介
- 2 本地仓库回退
- 3 远程仓库回退
- 方式一 reset Head
- 方式二 revert
- 4 总结
使用git进行代码版本控制时,肯定会遇到代码回滚的情况。回滚有两种:一种是本地仓库回滚,一种是远程仓库回滚。
本地仓库回退
使用git reset的方式:代码还没push到远程仓库,只是要撤销本地仓库的 commit 信息。可以直接使用 Reset HEAD进行回滚。
Reset Type 有三种:Mixed (idea默认)、Soft、Hard
1、soft
①移动本地库HEAD指针
意思就是,回滚后,仅仅是把本地库的指针移动了,而暂存区和你本地的代码是没有做任何改变的。
而你上次改动已提交到本地库的代码显示是绿色,即未提交
2、mixed
①移动本地库HEAD指针
②重置暂存区
意思就是,回滚后,不仅移动了本地库的指针,同时暂存区的东西也没了,意思就是你上次添加到暂存区的文件没了
3、hard
①移动本地库HEAD指针
②重置暂存区
③重置工作区
意思就是,回滚后,本地代码就是你回退版本的代码
4、keep
①移动本地库HEAD指针
②重置工作区
意思就是,回滚后,本地代码就是你回退版本的代码,暂存区的文件依然保存。
关于三种回退方式其他大佬的博文已经有过详细的解释。
To commit : HEAD^返回到上一版本;revision Number返回到指定版本号的版本;
第一种方式:使用reset Head加上git push -f强制提交。
先复制要回滚到哪个版本的版本号
reset type选择hard
这时候本地仓库已经回滚到指定版本的,指定版本之后的代码都消失了。但远程仓库还没有,push到远程仓库,会提示拒绝,但不能和远程仓库合并,因为合并就达不到回退的目的了。直接打开Terminal切到项目目录下输入 git push -f 强制提交。这时已经将回滚同步到远程仓库了,登录远程仓库查看,我们回滚到的指定版本之后的提交信息都没有了。
第二种方式 revert
网上也有人说第一种方式不好,以下是其他人的测试
远程仓库代码回滚,如果上 Google 上一搜,基本出来的答案都是使用 Reset HEAD 加上 git push -f 强制提交的方式。
我本地测试了一下,如果有两个人同时在这条分支上开发,其中一个人 小 A 如果使用这种方式进行回滚了远程仓库代码,另外一个人 小 B 此时本地还是回滚之前的代码,小 B 那里就会出现本地代码版本高于远程分支版本的情况,此时若小 B 进行了 push 操作,之前小 A 回滚的代码就又会被推送到远程的仓库了。除非小 B 在回滚后,将其本地仓库的版本也进行回滚。才能保证不会把回滚的代码重新 push 回远程仓库,但是如果开发人员多,就无法保证所有开发人员的本地分支都回滚!
因此,不要使用 git push -f 这种方式来强制回滚远程仓库代码!
我们也可以使用第二种方式:git revert的方式进行回滚项目
commit 之后,push 到远程仓库中。最终结果如下:
可以看到生成了一个新的commit记录,然后push代码到远程端。其他开发人员如果进行了 pull,其本地仓库也被正确回滚到了指定提交点,就无需再担心回滚的代码又被重新 push 到远程仓库了。
总结
第一种方式会抹除回滚到的版本之后的提交信息。resvert方式会记录回滚的操作;revert实际上的是生成一次新的commit冲抵原来的commit,使用revert只能回滚某一个版本的commit,所以要想回滚到指定版本需要一次一次的revert。