前提,我所在的公司采用 GitLab 进行代码管理。
这次的异常发生在不久前对系统的一次常规迭代升级过程中,由于系统依赖的第三方包出现了问题,导致服务起不来,为了不影响其他功能的使用,所以将 master 分支进行 revert 到上次的版本。
等到我们解决了依赖包的问题,重新从 dev 提了 merge 到 master 的申请时,却发现代码变动都不显示了(注:如果修改了代码,也可能出现“conflict”的问题,但是本质一样),导致无法合并分支。也就是说:被回滚的代码被认为已经存在于 master 分支上,不算改动。
revert 操作实际是只是进行了一次逆向 commit,将 merge 的代码进行回滚,但是 commit 的记录还存在。也就是说,dev 上面存在的待提交的代码,其实已经是 master 的过去代码,属于已提交过的状态,所以不会显示 different。
该核心思想就是:对 revert 的那次提交记录再次 revert 。
- git checkout master
- git checkout -b revert_tmp
- git log # 查询<版本号>,格式,如:f2c3b544166eec612ea6814d6cd19aeef46824f8
- git revert <版本号>
- git checkout dev
- git merge revert_tmp
- git push -f
与 revert 不同,采用 -- git reset 将 head 向后移动到上一次 merge 前的 commit 版本,会丢弃所有的 merge commit 记录(revert 不会丢弃,是逆向 commit),所以,再次合并不会出现记录不显示或者冲突的问题。
- git reset HEAD^ # 回退所有内容到上一个版本
- git reset HEAD^^ # 回退所有内容到上上个版本
注意:谨慎使用 –hard 参数,它会删除回退点之前的所有信息。
HEAD 说明:
–hard 参数 | 参数说明 |
---|---|
HEAD | 表示当前版本 |
HEAD^ | 上一个版本 |
HEAD^^ | 上上一个版本 |
HEAD^^^ | 上上上一个版本 |
以此类推... | |
^ 可以使用 ~数字表示 | |
HEAD~0 | 表示当前版本 |
HEAD~1 | 上一个版本 |
HEAD~2 | 上上一个版本 |
HEAD~3 | 上上上一个版本 |
以此类推.. |