场景
release 发布分支
preonline 预发布分支
testing 测试分支
master 主分支
feature_my_branch 开发分支
# 发测试
feature_my_branch -> testing
# 发上线
feature_my_branch -> master -> release
# 发预发
feature_my_branch -> preonline
在我上周五打算上线的时候, 我提了merge request到master,合并进去之后,临时讨论代码不发了,这就出现了问题。
因为我需要把代码回退回去,而回退有两个可选操作reset
和revert
,而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
这时候这个分支就正常了,再合并到其他分支就可以正确识别了。
1 条评论
感谢答主,第二个方法很安全