我用了十年 Git,但每次遇到 rebase 还是会手心冒汗。不是因为它难,而是因为它给了我太多“改错”的机会。
记得刚毕业那会儿,公司还在用 SVN。那时候的版本控制很简单:你想改代码,先 update,改完 commit,一切以中央服务器为准。哪怕你犯了错,顶多就是回滚一下,心里踏实得很。后来换到 Git,我感觉自己不是在做开发,是在开一台没有刹车的赛车。
第一次深刻体会这种差异,是2021年那次事故。我负责一个共享分支,早上写代码时随手敲了 git push --force,因为觉得自己的本地提交“更干净”。结果同事小李昨天花了四个小时合并的代码,在我的强推下瞬间消失。当时他脸色铁青,我大脑空白。还好我们团队有老手,他冷静地打开终端,敲了一串 reflog 命令,居然把丢失的提交找回来了。那是我第一次意识到:Git 的核心不是版本管理,而是“后悔药制造机”——它允许你犯错,甚至允许你犯那种足以杀死旧系统的错,然后给你一粒药丸。
后来我花了很多时间对比 Git 和 SVN,发现它们的根本区别不是分布式和集中式,而是对“错误”的态度。SVN 像银行,中央账本唯一,你只能存取款,业务有规则;Git 像每个人的自家保险柜,你可以随便折腾,只要不把钥匙弄丢,最后总能盘点。但这个自由是有代价的:你开始需要懂 reflog、懂 orphan 分支、懂各种边缘命令,否则你就是那个拿着保险柜钥匙却把自己锁在门外的人。
更让我不安的是协作中的“信任危机”。在 SVN 体系里,代码的“唯一真相”天然存在,大家不会因为 merge 而打架。但 Git 把真相分散到每台电脑,于是你们需要一些仪式:pull request、code review、commit message 规范……这些表面上是流程,其实是对“谁的版本算数”的临时约定。我见过两个高手为 merge 还是 rebase 争论到面红耳赤,最后谁也没说服谁。我觉得这才是 Git 真正的革命——它不是解放了开发者,而是把管理人类分歧的负担,从工具转嫁到了人与人之间。
如果你问我推荐哪个,我会说:在乎安全感和秩序的人,留在 SVN 吧;喜欢折腾、愿意为自己的每一个误操作负责、并且享受从灾难中抢救数据的人,Git 是你的天堂。但别忘了,Git 从不会替你判断什么是对的。它只是在每个错误之后,淡淡地递给你一片药。
我不是什么专家,到现在仍会搞混 detached HEAD 和 orphan branch。但这就是我与 Git 的关系:它给了我一身伤,也教会了我一件事——所有伟大的工具到最后都在考验人性,而人性最需要的,恰恰是那种可以随时重来的宽容。