sourcetree是现在比较火的git可视化工具,今天中午刚睡醒精神朦胧,提交了本地分支的版本,然后发现好像提错了,回滚,后来发现又没有提交错,可是回滚了代码又都没了,整整一个大模块。。。懵逼了。。。一时也不知道咋处理了,后来抱着试试的心态又重新回滚了一次,这下代码回来了,差点没吓死。。。现在总结一下回滚代码和重置的区别
这是两个过程:
回滚——是指将改动的代码提交到本地仓库,但未推送到远端仓库的时候
也就是说刚刚提交代码,没有推送,这时候你发现提交错了,只需要选择本地分支你刚提交的节点上,右击回滚一下即可,这时候本地分支会出现“Revert”的字样,推送按钮会出现提示推送的角标,这时候你可以直接推送一下,远端也不会有变化,只不过是推送一些日志记录或者其他与代码无关的,或者也可以提交好正确的代码后,一起推送。
还有一种狗血的情况就是我刚才说的,回滚后发现没有错误...(贼尬)...这时候刚写的代码已经没了...那就索性再回滚一次,也就是说撤销刚才的回滚操作,这时候本地分支节点上会出现“Revert 'Revert '”的字样...推送按钮也会出现提示推送的角标,这时候可以仿照上一步后半部分操作。
2、重置当前分支到此次提交——是指将改动的代码提交到本地仓库后,并已推送到远端仓库的时候
- 2-1、如果你发现推送了错误的代码,又不想重新写正确的,提交推送覆盖错误代码的话,就可以使用“重置当前分支到此次 提交”,选择刚刚推送分支节点的前一个或者某个节点,右击-->“重置当前分支到此次提交" ,此时会让你选择使用模式 “软合并---保持所有本地改动”——是指本地仓库将会重置到此次提交的节点,并且大于此次节点的本地仓库改动的代码 将会回退到你的文件状态里的暂存区(如下图)
- 2-2、“强行合并--丢弃所有改动过的工作副本”——如果使用此模式 ,本地仓库将重置到此次提交的节点,并且大于此次节点的本地改动的代码将会删除,重置完后,此节点会提示落后于远端仓库n个版本,(n取决于你重置节点的选择,或者说你要删除的代码变动节点区间),这时候有两种选择
- 2-2-1、选择一:在刚刚重置的节点上新建分支,重写正确的代码,然后推送到远端的新分支,回头再把这个旧分支的删掉,并把新分支的名字改成旧分支(这样做怪麻烦......)
- 2-2-2、选择二:刚刚完成重置节点后,会提示落后于远端仓库n个版本,此时本地仓库里已经把这些落后的版本的代码改动删掉了,按理来说本地仓库执行删除操作也算是改动了。只需要推送此分支到远端即可,但是为毛没有推送提示?只有拉取,拉取之 后就和原来一样了(后来想想可能因为会冲突,因为远端的还没删)那该怎么办呢,此时本地仓库的改动已经删掉了。所以本地仓库和远端推送之前的版本应该是一样的。只需要强制推送当前本地仓库到远端即可(注意:开启强制推送需要在sourcetree的选项里设置一下,此外强行推送有风险,最好备份一下分支)。
- 如果不想删除本地改动。模式选择—软合并保持所有本地改动,这样把本地仓库中要删除的代码删掉了,但是改动的代码还在。通过贮藏功能,将本地改动的代码先贮藏一下。在执行上面的强制推送步骤。然后再从贮藏恢复一下改动的代码。这样就大功 告成啦!
- 2020-7-7 更新:发现了一种更简单的方法可以不用强制推送。将分支重置某个节点的改动提交后,本地仓库已回滚,远程仓库还没。这时候不用强制推送。只需要删除远端仓库的对应的分支。再推送一次即可!