场景在 Git 开发中通常会控制主干分支的质量,但有时还是会把错误的代码合入到远程主干。 虽然可以直接回滚远程分支, 但有时新的代码也已经合入,直接回滚后最近的提交都要重新操作。 那么有没有只移除某些 Commit 的方式呢? 可以一次 revert操作来完成。 revert可以回滚指定的提交 语法git revert bb91a99836a4e291e960ec18d89329d8a65b4d52 # 撤销指定提交,直接产生一个新的commit,工作区中清除对应commit-id的代码 git revert --no-commit bb91a99836a4e291e960ec18d89329d8a65b4d52# 撤销指定提交,工作区中清除对应commit-id的代码,但是需要`git add && git commit `的手动提交 git revert --no-commit f7742cd..551c408# 撤销指定一串提交,不包括第一个提交f7742cd,但是包括最后一个提交551c408
样例考虑这个例子,我们提交了 6 个版本,其中 3-4 包含了错误的代码需要被回滚掉。 同时希望不影响到后续的 5-6。 * 982d4f6 (HEAD -> master) version 6* 54cc9dc version 5* 551c408 version 4, harttle screwed it up again* 7e345c9 version 3, harttle screwed it up* f7742cd version 2* 6c4db3f version 1
可能是流程或认为原因不小心合入了错误的代码, 也可能是合入一段时间后才发现存在问题。 总之已经存在后续提交,使得直接回滚不太现实。 下面就开始介绍具体操作了,同时我们假设远程分支是受保护的(不允许 Force Push)。 思路是重新产生一个新的 Commit 撤销之前的错误提交。 使用git revert <commit>可以撤销指定的提交, 要撤销一串提交可以用 <commit1>..<commit2> 语法。 注意这是一个前开后闭区间,即不包括 commit1,但包括 commit2。 git revert --no-commit f7742cd..551c408git commit -a -m 'This reverts commit 7e345c9 and 551c408'
其中 f7742cd 是 version 2,551c408 是 version 4,这样被移除的是 version 3 和 version 4。 注意 revert 命令会对每个撤销的 commit 进行一次提交,--no-commit 后可以最后一起手动提交。 此时 Git 记录是这样的: * 8fef80a (HEAD -> master) This reverts commit 7e345c9 and 551c408* 982d4f6 version 6* 54cc9dc version 5* 551c408 version 4, harttle screwed it up again* 7e345c9 version 3, harttle screwed it up* f7742cd version 2* 6c4db3f version 1
现在的 HEAD(8fef80a)就是我们想要的版本,把它 Push 到远程即可。 注意: git revert commit-id
是撤销指定提交,和前开后闭的连串撤销不同 注意git revert 之后,再提交merge request,会丢失代码,因为revert 多了一次提交记录 这次提交的记录就是删除多余代码 比如,git 合并了 feature-xxx => master,然后发现合错分支了,用了revert 然后再合并 feature-xxx => develop => test2 => master 过程中,会丢失revert部分代码 因为多了一个revert的commit 这种场景,不希望合丢代码,尽量用reset
|