你大概见过这样的文件夹:“初稿”“修改稿”“最终稿”“最终稿新”“这个才是最终稿”。这些名字很好笑,也很诚实。我们想继续改善作品,又怕改坏以后找不回来;想听听别人的意见,又怕几份修改互相覆盖。
程序员经常使用的 Git,就是一种管理版本和协作的工具。它的品味可以从这个日常困境理解:用一套清楚的结构,让保留过去、尝试未来和共同工作彼此支持。 保存得越可靠,尝试就越有底气;变化的来路越清楚,合作就越容易整理。
这篇文章用一本合写的书,解释其中三个关键设计。你不需要学习任何命令,也能看见它们为什么巧妙,以及这些判断怎样用于自己的工作。
一、把过去保存好,人才能放手改
假设你和朋友合写一本小说。第一章从一个平静的早晨开始,第二章已经核对过资料,结尾停在一个雨夜。现在你想重写开头,但希望保留这份完整的稿子,以便日后比较。
在 Git 里,你可以做一次“提交”:为纳入记录的内容留下一个明确版本,并附上一句话,说明这次完成了什么。它会记住当时各个文件共同组成的状态。以后取回这个版本,第一章、第二章和结尾能按当时的样子一起回来。

图片暂时无法载入,可通过上方出处查看原作。
这种安排很像建筑师保留一套互相配套的图纸。单独留住一张漂亮的立面图还不够;平面、剖面和尺寸必须对应,才能知道“这一版房子”究竟是什么样。对于一件复杂作品,保存完整状态,比记住零散修改更有用。
Git 也没有要求每次都机械地重存所有文件。没有改变的内容可以被新旧版本共同引用:你看到的是两份完整快照,底下相同的材料可以复用。这里同时照顾了两个需要——回看时,版本应当完整;保存时,重复应当尽量少。
这个设计的价值,是降低改变已经完成的东西时的顾虑。 有了可靠的起点,你就能认真试写一个更冒险的开头,并在读过两个版本之后做判断。保存因此参与了创造。不过,这份可靠有前提:Git 不会自动收录每一次敲字,你需要主动留下记录;重要材料也仍然需要备份。
二、把尝试变轻,选择才会真正增多
留有旧稿之后,下一个问题是:能否同时推进两个方向?原来的平静开场值得继续打磨,从争吵开始也可能更有力量。此时过早决定胜负,会把尚未写出来的可能性排除掉。
Git 用“分支”安顿这件事。你可以从现有版本分出一条试写路线,原方向继续保留。两条路线共享分开之前的历史,之后各自记录新的版本。你能来回比较,也能让一次未成熟的试验暂时停在那里。

图片暂时无法载入,可通过上方出处查看原作。
它的精妙在于分支很轻。创建一条分支,不必先把整个项目复制一遍;起初只需要增加一个指向已有版本的标记。可以把它理解成放下一张书签,写上“从这里开始试写”。随后,书签跟着这条路线的新版本向前移动。
这让“试另一种”成为日常动作。想象一位舞者试一个新动作:如果每次都得重新租场地、搭舞台、召集整支乐队,大量念头会在排练之前被筛掉。一个可以随时进入、失败也容易收拾的排练空间,会给探索更大的余地。工具也有这样的影响,操作成本决定了某种自由究竟有多容易被使用。
在通常的完整克隆方式下,Git 还把相关历史交到每个人的电脑上。你能在本地查看旧稿、记录进展、尝试分支,许多操作不必等待网络或中央服务器。等想法成形,再交换成果。尝试的空间与对外协作的节奏可以分开安排,个人思考因而保有连续性。
三、先找到共同起点,再处理分歧
允许各自尝试,只解决了一半问题。星期五,你和朋友带着不同版本回来,怎样把成果重新汇集?如果只是选择“最后保存的那份”,较早完成的好修改就可能被盖掉。
Git 在许多常见合并中会一起比较三份材料:你的版本、朋友的版本,以及双方出发时的共同版本。共同起点让差异有了来路。假如原稿的第一章是平静开场,而你的版本变成争吵开场,就能识别这是你做的修改;朋友对第二章的改动也能用同样的方法看清。

图片暂时无法载入,可通过上方出处查看原作。
图中两处修改位于不同位置,通常可以整理进同一份书稿。这个办法的聪明之处,是为比较补上了足够的上下文。只看两个结果,我们知道它们不同;加上共同的原稿,我们才看见两个人分别做了什么。
如果双方把同一处文字改成不同内容,Git 可能标出冲突,等待人处理。它不会因为某份稿子保存得更晚,就认定那个结尾更好。而且,文字上能够合并,也不保证故事成立:你在第一章写主角怕水,朋友在第八章写他成了游泳教练,两处文字可能顺利放到一起,人物经历是否说得通仍需审阅。
好的协作工具,应当让各自的贡献容易辨认,让需要共同决定的问题容易被看见。 Git 承担追踪、比较和组织文本的工作,内容是否正确、作品是否更好,仍由参与者负责。这个边界很实际,也让工具的能力不至于被误当成人的判断。
四、为什么这些设计称得上有品味
单独来看,保存版本、尝试分支、汇集修改,都是有用的功能。Git 更值得欣赏的地方,是它们出自一套相互配合的结构:版本保存作品的状态,并记住自己由哪个版本而来;分支标记某条路线走到哪里;合并借助这些关系寻找共同起点。
于是,同一份历史既帮助你回看,也支撑你另开方向,还为之后的合作提供依据。几个基本设计承担了许多工作。这很接近一件好家具的结构之美:连接方式安排得好,稳固、轻巧和便于拆装就可能一起获得,使用者不用为每个需要再加一套补救办法。
我们可以把这里的品味理解为三种判断:认准真正的矛盾,找到能同时照顾多方需要的结构,把日常动作做得足够轻。 Git 面对的是创造中反复出现的矛盾——既要保护成果,又要允许改变;既要独立探索,又要重新合作。它让这些需要之间少一些互相妨碍。
这种评价也有边界。Git 的命令和概念对新手并不总是友好,错误操作也会造成损失;面对复杂排版文件、图片和视频,自动比较与合并的能力有明显限制。内部结构的巧妙不能抵消使用门槛。欣赏它,应当同时看见它做好的取舍和留给使用者的负担。
五、离开 Git,你能带走什么
即使以后不使用 Git,这篇文章也可以变成三件很具体的事。它们适用于写作、做方案、设计产品,也适用于判断一个工具是否值得依赖。
- 重要改动之前,留下能完整恢复的起点。 重写一份方案前,保存正文、数据依据和对应图表,并写清这一版成立的条件。可靠的旧版本,会让你更敢于动手改善它。
- 把难以判断的选择,变成成本可控的试验。 犹豫两个开头时,各写五百字;拿不准两种布局时,各做一张草图。先让差异成为可比较的东西,再作取舍,同时保留回到原方案的办法。
- 合并不同意见之前,先把共同依据摆出来。 两个人拿来不同预算、文案或计划时,一起找出原版本、各自修改与修改理由。这样更容易区分哪些成果可以并存,哪些分歧确实需要讨论。
下次选择工具,也可以沿着这三点观察:我能否找回一个可靠版本?能否轻松试另一条路?能否看清合作者改了什么?这几件具体的事,比“功能很多”更能说明它会怎样影响你的工作。
Git 给人的启发,是让秩序成为探索的条件。过去有处安放,不同方向有处展开,合作时还有来路可循。于是,“再试一种”就有了实际可行的办法。
机制依据为 Git 官网《Pro Git》的基本原理、分支设计与合并机制。三张图为本文原创示意;书稿、图纸、排练与家具是解释性类比。“品味”及其可迁移的判断是本文评论,不是行为实验结论。