git revert执行后仅新增提交未完成代码回滚问题
你对git revert的作用理解错了。git revert不会把代码直接退回到你指定提交的版本状态,它的逻辑是:针对你给出的某一个提交,生成一个完全相反的改动提交,只抵消这一个提交带来的变更,这个提交之后的所有历史提交、代码改动都会完整保留。
你当时执行git revert HEAD~2,本质上只撤销了1bc90dd这一个提交(就是提交说明为changed git ignore的那个提交)的改动,在它之后的4b5ce64、a342294两个提交里加的BiasedCoin类、seed参数、random导入这些代码一点没动,所以最后文件内容和最新的a342294版本一致,只是多了一条撤销1bc90dd的提交记录——你看新生成的revert提交里也明确写了"This reverts commit 1bc90dd",只针对这一个提交做撤销,不是跳回这个提交对应的时间点。
根据你是否需要保留提交历史,选对应方案即可:
方案一:本地回退/允许强推覆盖远程分支
如果你还没把后面的错误提交推到公共远程,或者你有权限强推覆盖远程、不担心影响其他协作者,直接用git reset把分支指针移到目标提交就行:- 切到master分支后执行:
git reset --hard 1bc90dd971ea1bbb36cdd280f141cb4cc317ce0f - 如果之前已经把错误提交推到了远程origin/master,执行强推同步:
git push -f origin master
注意:强推会改写远程分支的历史,如果有其他协作者已经拉取过后面的错误提交,需要同步在本地做reset对齐,不要在多人共同开发的公共保护分支随便用这个方法。
- 切到master分支后执行:
方案二:不能改写公共分支历史
如果代码已经推到公共远程、不允许强推改写历史,还是用revert,但要把目标提交之后的所有提交全部反向撤销,不能只撤单个:- 先把之前错误生成的那个revert提交删掉,回到操作前的状态:
git reset --hard a342294cbf25550f48452807d33a64f0c0248c34 - 一次性撤销1bc90dd之后的所有提交,直接执行:
git revert 1bc90dd..HEAD
执行完会依次生成对应反向提交,把后面两个提交加的所有代码全部抵消,最终工作区的文件状态就和1bc90dd版本完全一致,所有提交历史都保留,直接正常git push就行,不需要强推。
- 先把之前错误生成的那个revert提交删掉,回到操作前的状态:
内容的提问来源于stack exchange,提问作者Vipul Rajan

