不懂 git,也能管住十几个 worktree
先承认一件事:git 是我的短板。
多分支、远端、rebase、merge、冲突、读提交图、force-push——这些我都不熟。我也闯过真实的祸:历史被缝乱,好几天的改动要一条条找回来。
但现在的局面是:一台机器上同时开着十几个 worktree,几个 agent 在不同分支上并行干活,PR 一天开好几个。按理说这是 git 最容易出事的场景,实际上反而比我自己手动操作的时候清楚。
办法不是先把 git 学透。是让 AI 管 git,我只管几条它必须遵守的纪律,以及几个我随时能问的问题。
一、我会问的四个问题
我不读提交图,但我会问问题。最常用的四个:
「列出这个仓库本机所有的 worktree 和分支:创建人、创建时间、落后主分支多少、远端有没有。」 这一句话能把局面摊开。哪些是我的、哪些是别人的,哪些已经合并、哪些落后很多、哪些只在本地没推——一张表全看清。
「由我创建的、已经合并的 worktree 和分支,都删掉。」 清理是最容易被忽略的。分支不删,几周后就是几十个不知道是谁的、不知道还要不要的指针。我现在每次合并完都会说一句。
「这个 PR 合并了吗?我刚推的提交进 main 了吗?」 这一条是吃过亏换来的。我在网页上随手合并了一个 PR,agent 不知道,又往同一个分支推了两个提交,还告诉我「PR 已更新」——实际上那两个提交根本没进主分支。现在的规则是:往已有 PR 追加提交之前,先查它的状态;已经合并了,就从当前位置切一个新分支、开新 PR。
「谁创建的?」 看到一个陌生的分支或者一个不是我写的提交,先问归属。别人的东西不删、不改、不顺手合。
二、AI 必须遵守的纪律
这些规则写在一份跨机器同步的记忆里,任何 agent 做 git 操作前都要读。每一条都对应一次真实的事故。
分支名要能看出是谁、在哪台机器上建的。 我的约定是 <机器名>/<agent>/<描述>。多台机器、多个 agent 同时干活时,看名字就知道归属,不用翻日志。
共享目录里,「切分支」不是本地操作。 未提交的改动会跟着 HEAD 走。有一次一个 agent 在共享目录里切分支,把另一个会话正在改的 41 个文件搬到了自己的分支上。所以每个任务一个独立 worktree,不在共享目录里切来切去。
禁止裸用 git stash。 stash 栈是整个仓库共享的,不属于任何分支。在干净的工作树上 stash 什么都不存,随后的 pop 会弹出另一个并行会话存的东西。临时回退一个文件用 git checkout <ref> -- <path>,要对比基线就开一个临时 worktree。
管道会吞掉退出码。 git push | tail 返回的是 tail 的退出码。推送失败、钩子拦截,看起来都和成功一模一样。要看完整输出就写进文件再读,或者开 pipefail。
rebase 之后用 --force-with-lease,不要再 pull。 pull 会把旧的远端历史合回来,历史就这样被缝乱。而且 force 永远不碰主分支。
合并是人的动作。 agent 可以推自己的分支、开 draft PR,不能 merge、不能推主分支、不能改分支保护。对我自己的私人记忆仓库例外:那里我授权 agent 自己快进合并,但遇到真冲突必须停下来报告。
三、并行太多是净亏
我也有过过头的时候:同时挂着七个 worktree 和三条自动循环。结果是脏代码要逐个 diff 才分得清归属,未推送的提交从一百多涨到四百多。
根因不是懒,是评审预算守恒:AI 把「写」的成本压到接近零,但「验、收、推、合、上线」一点没变便宜,全堵在人这一环。所以现在我会给并行设一条收敛线,定期收口:每做完一批,先合、先删,再开下一批。
四、长任务被杀后,先收拾现场
还有一类问题不是 git 本身,是 git 周围的残留。长任务被中途杀掉时,常见的残留有:
- 被临时隔离的配置文件没有还原,后续的 rebase 因为「有未暂存的改动」被拒;
- 测试中途停掉,留下一个还在占端口的孤儿服务;
- 被强杀的脚本留下锁文件;
- shell 被回收了,但从 worktree 里启动的开发服务还活着,删 worktree 之前要先停。
还有一条判断:后台包装进程被杀,不等于里面的串行脚本停了。 判断进度看 git log,不看进程列表。
五、我学到的 git,刚好够用
这样用了几个月,我对 git 的理解反而比以前好了——不是因为读了教程,而是因为每次出事,AI 都会用几个简单的心智模型给我解释:
- 分支就是一个指针,删分支不删提交;
- rebase 会改提交的 hash,所以别人已经拿到的提交不能 rebase;
- 合并没合进去,就看这个提交是不是主分支的祖先(
git merge-base --is-ancestor)。
这三条,够我判断 agent 说的话是不是真的了。
收束
短板不一定要先补齐才能往前走。git 我仍然不熟,但我知道该问什么、该禁止什么、出了事去哪看。
问题我来问,命令 AI 来敲,纪律写成规则,合并按钮留在自己手里。 对一个不熟 git 的人来说,这比背下所有命令要可靠得多。