我再项目dev分支上开发的时候,想把代码还原到之前某次commit的版本,最后用reset head + force push接解决问题。
比如以上,dev分支最新版本是v4,我想回滚到v1的版本,放弃v2-v4的commit,具体步骤如下
0、最重要的,你必须执行git pull,保证分支代码最新
1、show history,定位至v1版本commit处,右键选择Copy Revision Number,表示拷贝该次commit版本的id,可以理解成该次提交的游标,比如我的就是e51f560fcb1c0fdb4102852fdc702b5f04c06ed8,还有另外一个id也可以表示版本id:右键选择Select In Git Log,找到类似这样的描述:
红色框的随机码的作用和上面的字符串作用一样,都可以表示commit的版本id
2、执行reset head
填上第一步拷贝的v1版本的id到To Commit后面的文本框中
这里可以先执行Validate,验证下是否是你需要重置的目标版本,没问题了就执行Reset
3、此时执行git commit,你会发现v2-v4提交的代码出现在了你待提交的清单里面了,你也可以git history查看下你的提交记录,发现v2-v4的提交记录已经在本地消失了,但是这个时候,只是在本地生效,远程origin还是存在v1-v4的提交记录的。这个时候你需要做的就是把待提交清单里面的代码,全部回滚,执行revert操作,直到git commit提示没有任何需要提交的代码(这里需要注意下:如果你在v2-v4提交记录里面,存在新增add 的工程文件,会显示在待提交清单的最后一个分组,叫做unversioned***,不在版本控制内的代码,这些如果需要放弃,请手动执行delete,不然后导致后续commit rejected)。
4、此时可以执行git push了,这个时候需要注意,在push按钮边上有个下拉提示,点开,里面会有force push,注意,这里一定要是force push,不是常规push(解释下:如果选择普通的push,因为你的本地提交和远程记录存在差异,会弹框提示push rejected,让你cancel/merge/rebase,无论是merge还是rebase都会将远程origin上的v2-v4的代码再次加入到你本地的版本,所以,必须执行强制push,force push)
5、到这一步,恭喜你,回滚成功了。