1.第一种情况:还没有push,只是在本地commit
git reset --soft|--mixed|--hard <commit_id>
git push develop develop --force (本地分支和远程分支都是 develop)
这里的 <commit_id> 就是每次 commit 的 SHA-1 ,可以在 log 里查看到。
--mixed 会保留源码,只是将 git commit
和 index
信息回退到了某个版本。
--soft 保留源码,只回退到 commit
信息到某个版本.不涉及 index
的回退,如果还需要提交,直接 commit
即可。
--hard 源码也会回退到某个版本, commit
和 index
都会回退到某个版本(注意,这种方式是改变本地代码仓库源码)。
当然有人在push代码以后,也使用 reset --hard <commit...>
回退代码到某个版本之前,但是这样会有一个问题,你线上的代码没有变,线上commit
,index
都没有变,当你把本地代码修改完提交的时候你会发现全是冲突.....这时换下一种
2.commit push 代码已经更新到远程仓库
对于已经把代码 push
到线上仓库,你回退本地代码其实也想同时回退线上代码,回滚到某个指定的版本,线上,线下代码保持一致,你要用到下面的命令:
git revert <commit_id>
revert 之后你的本地代码会回滚到指定的历史版本,这时你再 git push 既可以把线上的代码更新。
------------------------------------------------------------------------------------------------------
* git revert HEAD 撤销前一次 commit
* git revert HEAD^ 撤销前前一次 commit
* git revert commit (比如:fa042ce57ebbe5bb9c8db709f719cec2c58ee7ff)撤销指定的版本,撤销也会作为一次提交进行保存。
------------------------------------------------------------------------------------------------------
注意:git revert 是用一次新的 commit 来回滚之前的 commit,
git reset 是直接删除指定的 commit ,看似达到的效果是一样的,其实完全不同。
第一:上面我们说的如果你已经 push
到线上代码库,reset
删除指定commit
以后,你 git push
可能导致一大堆冲突,但是 revert
并不会。
第二:如果在日后现有分支和历史分支需要合并的时候,reset
恢复部分的代码依然会出现在历史分支里,但是 revert
方向提交的 commit
并不会出现在历史分支里。
第三:reset
是在正常的 commit
历史中,删除了指定的 commit
,这时 HEAD
是向后移动了,而 revert
是在正常的 commit
历史中再 commit
一次,只不过是反向提交,他的 HEAD
是一直向前的。