gitlab上代码回滚把本人坑了后, 陷入思考🤔”bug是谁”?
少年, 你点击过gitlab
下图中的金灿灿按钮么? 本篇文章将通知你如何正确应用这个按钮。
一、 背景
原打算xx号下午3点我开发的性能要上线, 下午2点将开发分支合并入master
分支筹备跑上线流水线, 然而不巧这一天server同学遇到了点问题, 导致上线工夫延期了, 与此同时前端还有其余分支明天要上线, 曾经筹备合并入master
分支, 过后我要做的就是疾速将master
回滚。
我提交的"mr"
信息外面有"revert"
按钮, 一看就晓得这个按钮负责回滚代码, 阴差阳错的就点击了这个按钮, 当然啦代码被胜利回滚并且也没有影响后续同学的上线, 但故事并没有这么简略。
当n天后我负责的代码打算再次上线时, git merge branch
在masetr
上merge
我的分支居然生效了, 我的代码中新增的局部无奈合并入master
, 过后情况紧急眉头都皱成了一个”川”字, 着急兽进化(🧬)钢铁着急兽。
二、 强推灰飞烟灭
过后现场求助了同组的其他同学, 将本地我的分支git merge master
, 此时我的分支就是最新的, 再去gitlab
上敞开master
的爱护机制, 强行将分支内容推到master
上进行笼罩, 再将master
的爱护机制从新关上。
这一套操作当然存在问题, 强推master
可还行? 并且这种操作须要相干人员的审核, “费劲+有危险”。
当所有尘埃落定了也该开始思考了, 那么到底为什么会呈现代码无奈合并入master
, 到底是哪一步出了问题, 过后我的gitlab
应用的语言是中文, 按钮只显示"还原"
两个字, 我赶快将语言切换至英语, 此时按钮的文案变成了"revert"
, 我就从嫌疑人"revert"
开始考察吧, 看看他与不在场的"reset"
有什么关联。
三、静下来学习reset与revert的区别
revert
移除某个commit
记录, 并且生成一条新的commit
记录。
假如以后的分支状态是下图:
执行
git revert -n gt56th
git add .
git commit -m'feat: rm a'
reset
挪动HEAD
到某个commit
上, 这个commit
之后的commit
全副舍弃, 并且你本地的代码是没有变动的。
假如以后的分支状态是下图
执行git reset gt56th
四、解释为何代码合不进去
通过比照咱们就能够晓得为什么, 那天下午我无奈把代码合并入master
分支的起因了。
由下面的步骤图可知, revert
后的代码里是明确记录了删除指标commit
也就是commit id
为gt56th
的这条数据, 那么咱们再将含有commit id
为gt56th
的提交merge
到master
分支时, git
的算法会判断出这个commit
已被移除, 所以git
会认为我分支的代码落后于master
, master
外面移除了这条commit
的代码才是最新的。
git
这样判断是没问题的, 咱们多人开发的时候, 假如’a’与’b’一起开发一个我的项目, ‘a’删除了a.js
文件并且merge
到master
, 第二天’b’改变了其余中央也merge
到master
, 此时就算b的代码上没有移除a.js
, merge
后也不会在master
分支上减少a.js
文件。
五、默认revert此事有蹊跷
咱们来聊聊既然gitlab
默认应用revert
性能来回退代码, 也就是说官网认为这种回滚形式是最棒的, 那么它棒在哪里?
第一: 连续性
就算是回退操作, 也算是对master
的失常操作, 然而间接reset
会导致工夫线的缺失, 让咱们不晓得两头产生了什么, 长期来看这样不利于解决问题。
第二: 中途有人拉代码
‘a’的代码push
到了master
上, 2个小时后a将master
代码reset
掉, 看似一切正常, 然而殊不知’b’刚刚pull
了master
的代码到本地, 此时就埋下了隐患, 因为如果’b’进行master
的合并操作, 会将’a’之前删掉的代码再次公布到master
分支, 导致代码的谬误上线。
第三: 不便回滚
比如说咱们的gitlab
是默认merge
结束就删除源分支的, 此时咱们能够间接拉取master
的最新代码, 因为能够在git log
外面找到所有的commit
这样就不怕玩坏了分支代码找不到了。
六、reset 里的大学问
讲了不少revert
的益处与害处改说说reset
了:
假如我以后我的项目里有 a.js
、b.js
、c.js
三个文件, a.js
被git commit -m''
, b.js
被git add
, c.js
没有被git监控:
git reset –hard CommitId (暴力删除)
这个写法间接将HEAD
回退到指标分支, 并且删除所有以后分支之后编写的代码, 也就是说会将你的代码革除哦。
这个办法适宜齐全舍弃某些代码的场景, 因为你在git log
命令外面都无奈查到被删除的commit
记录了。
git reset –soft CommitId (难受的?)
这个写法间接将HEAD
回退到指标分支, 并且保留你在指标commit
之后的批改, 这些批改都在暂存区
, 咱们能够持续开发相干的性能, 最初对立 git add. && git commit -m ''
一次即可。
这种形式让我想到了咱们能够平时在本人电脑上提交多个commit
, 然而push
之前咱们能够先回退, 而后把commit
合一再提交。
git reset –mixed CommitId (默认的, 当咱们不写参数就是这个指令)
将指标提交之后的代码还原成未被监控的状态, 也就是你的代码须要git add .
一下才能够进行治理, 这个招式相当于重置了提交态, 然而也有一些小小问题, 比方咱们有一些没有被git add
的文件会与其余文件不好宰割开, 给我的感觉就是向咱们以后的代码外面塞入很多新的代码, 应用git status
查看的话就全是红色的。
七、流程梳理得出计划
曾经理解了上述的知识点, 那么能够推导出一套比拟牢靠的回滚流程了, 当咱们要将曾经merge
到master
的代码临时回滚, 并且后续还会上线这些代码时, 先点击gitlab
上的revert
按钮, 再将本人本地的代码git reset 线上commit版本
这样就能够将这些代码变成新的commit
, 这样就能够再次申请merge
到master
也不会合并不上了。
八、问题的呈现与考虑
刚呈现这个问题的时候, 习惯性的认为gitlab
出问题了, git
的某些算法出问题了, 然而通过系统性的剖析才明确, 出问题的是本人的操作。
将gitlab
平台设置成了中文, 导致某些英文能够表白的含意无奈表白, 这也是个问题点, 写代码最好能更分明的晓得代码的本意, 而不是翻译过后的意思。
end
这次就是这样, 心愿与你一起提高。
发表回复