三个人直接在 develop 上开发,其中一人 rebase 后 force push,另外两人各丢了 2 个提交,第二天发现代码里少了一个校验。乍看像缓存或者权限的锅,追下去往往不是。

git config --get receive.denyNonFastForwards
git reflog --date=iso | head -20

追下去是这么回事:共享分支没有保护,谁都能强推。开发习惯在公共分支上 rebase,历史被重写后别人的提交就没了。

「共享分支覆盖」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。

偶发问题先统计频率,一小时几次和一天一次,查法完全不同。改完顺手把文档补一句,省得下次自己重新推一遍。

监控和日志的时间要对上,时区不一致会多绕很大一圈。

具体做法是,develop 和 main 开启分支保护 禁止 force push;个人改动走 feature 分支 通过 PR 合并;必须 rebase 时先确认没有其他人的提交;误覆盖后用 reflog 或远端备份恢复。

验收就看一点,develop 上 force push 被服务端拒绝,任何人的提交不会再因为别人 rebase 而消失。

作者 9823189