场景

release 发布分支
preonline 预发布分支
testing 测试分支
master 主分支
feature_my_branch 开发分支

# 发测试
feature_my_branch -> testing

# 发上线
feature_my_branch -> master -> release

# 发预发
feature_my_branch -> preonline

在我上周五打算上线的时候, 我提了merge request到master,合并进去之后,临时讨论代码不发了,这就出现了问题。
因为我需要把代码回退回去,而回退有两个可选操作resetrevert,而web操作的界面,有一个特别诱惑的revert按钮。
如图。

经过我的查询,说revert可以保留之后的分支信息,只回退当时那个版本,刚好,周五的时候,我合并进去之后,还有其他的分支合并进去,所以刚好符合当前的场景,我就用了,也确实里面的代码没了,我就等着周一上线,而我还不知道什么在等着我。

问题

周一上班,开开心心的打算重新merge代码到master然后上线。结果发现,master不认我之前回退的版本里的代码了。
只认得我新加的解决小bug的代码了。这可坏事了。
原因是,git是依据提交来确定哪些改了哪些没改,所以他根本不会对比两个分支的代码结构,而是查了一下记录,这个文件这几行提交过,然后就不管了。

解决

第一个解决办法:
git reset强退版本,把当时合并到master的分支重新合并一次,release也一样用reset回退,确保是可以解决问题的。
第二个解决办法:
是其他同学在群里说的,我可以把master的代码merge到开发分支,然后把当时revert的请求再revert一次。
当时的命令是。

# 开发分支
git checkout feature_my_branch
# master代码合并到开发分支
git merge master
# 这样开发分支就有了,之前revert的记录了
git commit -am mergemaster
# 将当时revert的版本,再revert一次
git revert -n 845bbc8652d690029aceca76d8b9c17cd0e6e1eb
# 提交
git commit -am fixRevert

这时候这个分支就正常了,再合并到其他分支就可以正确识别了。

最后修改:2021 年 08 月 11 日
如果觉得我的文章对你有用,请随意赞赏