0:00
/0:15

请打开声音观看


2026 年 8 月 12 日 · 迪拜,阿联酋
25.2048° 北纬 · 55.2708° 东经 · 时区 UTC+4
第 15,208 个生命日 · 第 1,474 天在迪拜


很久以前,在另一段人生里,Yandex 办公室的一位后端工程师试着向我解释,有时需要把某个东西从一个分支 cherry-pick 到另一个。

我认真听着。我向来尽量认真听程序员说话,因为从他们脸上就能看出来:这一定是极其重要的事。某处有一棵树,树上有分支,分支上发生 commit,有时要 merge 分支,有时又不能 merge,那就得 cherry-pick 点什么。特别严重时,会出现冲突。

对我这个产品设计师来说,这一切像某种古老的卡巴拉秘学。我懂界面、场景、信息架构,能花几个小时争论用户为何点这里而非那里,为什么一个按钮要比另一个向左八个像素,以及产品团队为何连续第三个月都在设计人们根本不需要的东西。我能画出相当复杂的系统,解释它在一百种状态下该怎样表现。但之后便是一条边界。边界那边,住着程序员。

我把 Figma 交给他们,他们走进自己的终端,世界开始遵循另一套物理规律。那里有仓库、容器、环境、端点、迁移、密钥,以及神秘的 Git。而我留在河的这一边。我以为宇宙本来如此:设计师设计,程序员建造。建筑师画地图,另一个人随后真的穿过森林。

许多年过去了。我搬到迪拜,换过几段生活、职业、公寓、团队、界面和自我认知。有一天,我发现自己抱着笔记本,夹在 Tilal Al Ghaf 的别墅带看、房地产通话、自己网站的修改、孩子、狗、搬去 Palm Jumeirah,以及又一次为经纪业务搭 CRM 的尝试之间,平静得很,正在对智能体说:把改动提交,再推送。

我看着这句话,忽然意识到,发生的事比学会又一个工具重要得多。

我渡过了河。

河对岸的 Alexander Nevsky:文件成为记忆,代码开始长出分支

起初是文件

文件有一个讨厌的特点:它们只存在于此刻。老设计师很熟悉这种考古—— final.fig, final-final.fig, final-v2.fig, final-v2-new.fig, final-v2-new-real.fig。每个新文件都得设法保存前一个的记忆。有时记忆在文件名里,有时在 Archive 文件夹里,有时在设计师脑子里,有时则完全消失。多年来,我们一直试着手动管理时间。
Git 提供了完全不同的思考过去的方式。世界每次变化,不必再完整复制一份世界。可以保存变化本身:这里原本这样,后来我改成那样,这是原因,这是系统变得不同的时刻。这个时刻叫 commit。

我花了很多年才感受到这个词的美——不是技术的美,而是几乎形而上的美。 Commit 是对现实的承诺。你说:这就是我此刻愿意负责的世界状态。在此之前,改动可能像建筑垃圾散在周围:几个文件改了,一个删了,另一个新出现,某处逻辑变了,某处智能体不知为何重写了半个项目,明明没人要求。一切还不确定,一切都还能放弃。

然后你做一次 commit,混沌便有了名字。

修复房源卡片布局, 添加业主匹配, 恢复认证流程, 更新智能体指令, 别再搞坏生产环境.

最后一条尤其重要。

这时,一件奇妙的事发生了:过去不再消失。它变成了一条路。

很长时间里,我以为记忆在脑子里

也许这就是我如今如此关注神经网络记忆的原因。我们习惯把记忆看成人的属性。我记得第一间办公室、莫斯科、我们争论产品的房间,也记得那位给我讲 cherry-pick 的后端工程师,虽然当时我几乎肯定一个字都没懂。我记得 2022 年 7 月 30 日——我自己迪拜计时的起点。

今天是第 1,474 天。也可以这样记: 迪拜 / commit 1474.

这期间几乎一切都变了:住址、工作、我对工作的看法、身边的人、孩子的个头、家里东西的数量、笔记本里神经网络的数量,甚至“我是谁”的定义。但人的记忆不可靠。它不断重写历史,每次回忆过去,我们都会稍稍编辑它,去适应今天的自己。

Git 不一样。它相当冷静客观。它说:过去如此,变化在这,谁改的,什么时候改的,为什么改——前提是你没偷懒,写了条像样的消息。从某种意义上说, git log 是我见过最诚实的自传之一。没有事后的文学加工,也没有事后显得更聪明的欲望。

周二,02:14——弄坏认证

周二,02:47——修好认证

周二,03:06——修好修认证时弄坏的东西

真实生活大致就是这样。

然后,智能体出现了

到这里,一切彻底变了。以前电脑是工具:你按按钮、移动鼠标、打开程序,亲手执行操作。后来出现能执行命令的软件。现在我打开项目,里面可以有一些存在在工作,只需向它们描述意图。

一个读代码,一个研究架构,第三个修界面,第四个检查第一个的结果,第五个能在我去看联排别墅的路上写数据库迁移。我逐渐不再是那个每个动作都亲手做的人,越来越成为指定行动方向的人。

过去我设计人与程序之间的界面。如今我设计人类意图与众多人工执行者之间的界面。突然发现,程序员那些老词,恰恰成了我需要的东西。

因为如果只有一个人在为你工作,还可以指望他的记忆。有智能体替你工作时,这种指望很快就结束。它们需要领地、规则、历史,理解这里什么能碰、什么不能。它们需要文件形式的上下文,而不是我的直觉。

于是,我生活里出现了 .gitignore,我完全没想到,它竟是整个开发领域里最富哲学意味的东西之一。

.gitignore 是一张清单,列出 世界应该遗忘的东西。

并非一切都值得进入历史。有临时文件、秘密、垃圾、中间产物,以及只存在于你机器上、完全不必送出去的东西。想正确保存记忆,先得决定哪些不必记。人类似乎比 Git 晚很久才想到这一点。

还有 AGENTS.md 和其他文件,你在里面给后来者留下指令。如今,后来者不一定是人。你真的在给未来的存在写信:这是项目,这是结构,这是规则。不要无故改这里。这里用这种方法。这里先读文档。改完检查构建。别碰这个文件夹。已有实体时别再发明新的。

我喜欢这种新的书写形式。过去父亲写故事,想保存自己的世界并传下去。如今我有时半夜写 Markdown 指令,好让清晨某个未知的 AI 实例明白我的项目如何运作。这两种行为之间的距离看似巨大,有时我却觉得几乎没有距离。我们始终在做同一件事:试着把上下文传给后来者。

身处可能性分支之间的 Alexander Nevsky:有的路将留作实验,有的终将成为主线历史

分支

过去最让我害怕的词,大概是 branch。树枝。现在我终于明白,为什么树会成为如此牢固的隐喻。生活也几乎从不沿单线发展。有主分支,有实验,有你决定全部重来的版本,有被证明是错误的版本,也有你暂时不敢并入主线的版本。还一定有一个两个月前遗忘的分支,某天再看,已不明白谁建的、为什么建。

有时,这就是你的人生,毫不夸张。

main ——莫斯科。

dubai — 2022.

real-estate — 2026.

ai-orchestration ——也许很早就分出来了,却一直在不起眼的地方生长。

personal-brand ——仍在积极开发中。

而这一切之上,还有一个巨大的分支叫 family,它比其他大多数系统都古老,有自己的一套部署规则,而且远非总有文档。我有三个孩子,所以分布式系统多少还是懂一点的。

分支的美在于,你不必摧毁今天的世界,就能试试明天的世界。可以分出去、测试、犯错、改主意、返回,也可以某天看着结果说:对,这个版本更好。合并。

昨天还是实验的东西,成为主线历史的一部分。我们做多数重大决定,不也是这样吗?新生活起初独立存在。你小心试穿它:新国家、新职业、新角色、新工作方式。然后某一天,明明没有人正式封死回头路,你却已明白:这不再是实验分支。这就是 main.

Alexander Nevsky 看着合并发生:许多可能的道路汇成一段历史,最终被我们叫作当下

而某个地方,还放着 cherry-pick

很多年后,我终于也懂了 Yandex 那位后端工程师。他不是在传授禁忌魔法。 Cherry-pick 大致意思是:不必拿走别人的整段历史,有时只要取其中一个需要的改动。

我觉得,这也是编程之外最有用的原则之一。不必整个人变成另一个人。有时取一个好的 commit 就够了。

从父亲那里,取在普通一天里看见故事的能力。从产品设计,取寻找系统的习惯。从经纪工作,取对价格、地点、时间和面前具体那个人的关注。从程序员,取 Git。从 AI,取速度。从迪拜,取那种近乎病态的信念:未来可以先想象出来,再亲手建成。

Cherry-pick.

把需要的 commit,拿到自己的分支。

然后继续走。

但 commit 还没有改变外面的世界

这也是一个重要发现。你可以在本地做无数次 commit。项目很棒,历史整齐,改动已记录,但只要还没做 push,这一切都只在你的机器上,在你那个本地版本的世界里。

而在这里,一个完全技术性的词,忽然变得几乎令人疼痛地人性化。因为那种 push 之前 我太熟悉了。长时间地做、准备、重做、思考、完善。建网站,写文章,想定位,做新产品,拍视频,重画卡片。再好一点,再查一遍,暂时还不让人看。

多数人都有一个巨大的本地仓库,装满未完成之事 push.

我怀疑设计师的尤其大。我们很会在封闭的 Figma 里做漂亮东西,却更难把结果送出去,承认它已不再只属于自己。

也许这就是我如此喜欢这句短语的原因:提交,然后推送。先记录,再送出去。别等项目的最终版,也别等自己的最终版。它不会存在,Git 本来就不假设有最终版本。也许这正是它最大的智慧。

Alexander Nevsky 把改动放进世界:commit 保存意图,唯有 push 让它成为事件

只有当前版本。

HEAD.

顺便说,这名字很好。你的脑袋此刻所在的位置。之前的一切已经成为历史,之后的一切还不存在。

有时会发生冲突

当然。如果一个如此像生活的系统居然没有冲突,反而可疑。你改了一行,别人也改了同一行,现在两个版本都要求成为现实。Git 停下来说:你自己决定。

我很喜欢这一点。它不假装知道正确答案。这是一种真相,那是另一种,无法自动合并。恰恰在这里——冲突点——需要人。

这似乎很好地回答了许多关于 AI 的讨论。机器能执行的流程越多,那些需要的并非再产出一个方案,而是作出以下选择的地方,就越清晰: 选择世界的版本。对我而言,AI 编排正是如此:不是让某个智能体干得更快,而是理解全部成果中哪些该进入 main.

Git 改变了我对错误的态度

日常生活里,错误常让人觉得是破坏:做错了,一切坏了,得设法恢复以前的状态。在版本控制系统里,错误成为历史的一部分。只要历史保存得好,实验就不那么可怕。

可以查看 diff,看清究竟改了什么,恢复过去,开新分支,或撤销失败的决定。这带来惊人的自由。不是不犯错——Git 没这么承诺。它提供的更有用:可逆性。

产品设计教了我多年如何给界面做原型。Git 却意外教会我给现实做原型。

有时傍晚,我在 MacBook 上打开终端,窗外是迪拜。这座城市本身就像一个项目,有人在实验分支里开发了太久,后来某天竟疯狂地决定把它合并进 main.

我现在住在 Palm Jumeirah,这个地方尤其能解释这个想法。先有想法,再有图纸上的线,然后是工程模型,之后人们真的开始往海里倒沙。我很难想出更直观的例子来说明 git push 把人类意图推入物质现实。

曾经是信息的,成为了地理。

白天,我可能在讨论一栋别墅:面积、价格、位置、收益率、坐标、交付时间。一个小时后打开 CRM,请智能体修改房源卡片的机制。然后检查 diff,拒绝一半改动,要求修正,提交,再推送。晚上写一篇文章。不知为何,这一切不再像几种完全不同的职业。

经纪人、设计师、作者、AI 编排者。过去我想找一个词解释这一切。现在觉得,根本没必要。Git 也不试图用一个文件解释整个项目。它保存的是 变更历史。

也许,人也差不多是这样。

我们不是名词。我们是 log.

git status

还有一条我尤其喜欢的命令: git status。它不构建、不修复、不创造任何东西。只告诉你此刻在哪,什么改了,什么已准备好提交,什么还在外面,以及项目到底发生着什么。

有时我觉得,人也该有一条命令叫 git status。不需要励志书、战略会议,也不需要立刻规划未来十年。只停下来看看:现在在哪,自己什么变了,什么已准备好记录,什么仍半吊子地悬着,什么早该删掉,什么该加入 .gitignore,又有什么终于该送出去。

2026 年 8 月 12 日。生命的第 15,208 天,在迪拜的第 1,474 天。

过去,我坐在 Yandex,把“cherry-pick”听成某种未知仪式的名字。现在身边能同时有几个 AI 智能体工作,哪个动了与任务毫不相干的文件,我还会骂它。世界改变一个人词汇的速度,惊人地快。

但更有意思的是另一点。有时,一个词从极狭窄的专业领域走来,突然成了某种一直存在的现象的名字。

我们一直都在做 commit,只是没这么叫它。

在新国家的第一天,是 commit。孩子出生,是 commit。离开公司,是 commit。新职业,是 commit。搬家,是 commit。决定不再只做设计师的那一刻,是 commit。明白 AI 已不只是一个你使用的应用,而是一个能在其中建造的新环境的那一刻,又是一次 commit。

但生活里,只有 commit 不够。

可以经历庞大的内心历史,却从不让人看见。可以永远准备成为某个人,在本地做出完美产品,在草稿里写出精彩文章,拍完视频留在 Photos,建一个永远没人打开的网站,或想出一段永远留在实验分支里的新生活。

所以,今天对我而言,咒语的后半句甚至比前半句重要。

推送

把改动发到其余世界所在的地方。让它有一个 remote。让别人的 review 开始,让人不同意,让冲突出现,让事实证明有些东西还得修,再做下一次 commit。

这就是前行。

也许因此,如今智能体做完一项工作,问接下来干什么时,我喜欢用两个词回答。其中几乎有种父亲般的意味:像长者送晚辈上路,不打算长篇解释世界怎么运转,因为道路终究会解释得更好。

提交,然后推送

记住你改变的,别只留在自己手里。