现在我们已经可以开发一个相对完整的项目了,有规范、有版本控制,也有远程仓库。但假如想尝试不同方案,例如按钮点击后是打开抽屉还是对话框,你拿不准。逐一尝试又不方便对比,这该怎么办?

这时候就需要分支和工作树。

Git 分支

设想一棵树,它向上生长,有很多分叉的树枝。如果主干是我们现在的 main 分支,这些树枝就是其他分支。各个树枝分别生长,但最终都连着主干,就像各个开发者在不同分支上写代码,最后合并到 main 分支一样。

图解 Git 分支

这些分支的代码是独立的,不会互相影响。例如,你创建了一个叫作 pill 的分支,将界面中的圆角都改为全圆角,那么无论你怎么修改,都不会影响 main 分支,除非你合并代码。

这就是 Git 分支,可以让不同的开发者分别独立地去开发代码,最后只要将代码合并到一起即可。

创建 Git 分支

你可以使用 Git 命令来创建分支。当然,在 Codex 中,也可以让 AI 帮你创建 Git 分支。

git branch 分支名

如果你需要创建并直接切换到新的分支,需要使用这个命令。

git switch -c 分支名

合并分支

如果我们在新的分支改完代码,想要合并到主分支,也可以利用 Git 命令来实现。

git checkout 要合并的分支,例如我们要合并到 main
git merge 要合并的分支,我们这里是 codex/purple  

当然,你依然可以使用 AI 来帮你直接完成这个操作,例如可以这样写提示词。

帮我把这个分支合并到 main

对于新手,我更建议让 Codex 帮我们合并分支。稍微复杂的项目在合并时,可能出现代码冲突;工程师可以通过审查代码来解决,而新手不一定具备这种能力,让 AI 合并时可以请它一起检查这些问题。

工作树

工作树是 Codex 基于 Git 工作树提供的功能,它的核心特点是让代码在本地同时拥有多个分支版本,而不是只能打开一个版本。这里说得有些晦涩,不妨举个例子。

以前你在电脑上改同一个软件,一次只能开一个版本,想改别的就得切换覆盖;有了“工作树”,你可以在电脑里同时打开这个软件的多个不同版本,两头同时改,彼此完全独立。

如果你对 AI 时代的开发感兴趣,你一定注意到很多人都在说这个功能,那么为什么它在 AI 时代变火了?主要原因是 AI 时代以前是一个人干活,慢慢改还不容易乱;现在是一群 AI 同时帮你干活。如果让它们在同一个文件夹里一起敲键盘,反复修改很可能会把对方的代码改坏。工作树给每个 AI 安排一个独立的“专属工位”,大家各自做完再统一汇总,就能又快又稳地让多个 AI 一起开工。

漫画图解工作树

说回正文话题,在 Codex 中,你可以通过以下方式派生对话或创建工作树。在此之前,我们先介绍 Codex 中这两种操作的区别:

  1. 第一种方式本质上是让一个新的智能体继承本次派生对话的上下文,无须从零开始。但它仍在当前项目中创建,因此并不是我们上面说的工作树。这个功能更多用于转交任务,避免上下文过长或冗余;

  2. 第二种才是我们前面介绍的工作树,它会在本机的用户目录下名为.codex的隐藏文件夹中复制一份项目,在这里进行更改就可以隔离两个项目的工作空间。

    在终端输入 pwd 命令即可看到对应的文件路径

本地派生对话

在已有对话的项目中,可以点击下图所示的图标,派生出一个本地对话分支。

Fork 按钮

点击后,会打开一个对话框,询问你想以哪种方式派生对话。如下图所示,分别是在当前工作区创建,以及在新工作树中创建;第一种就是本地派生对话。

选择派生方式

工作树

这就是我们上面说的工作树。例如,我们之前做的 Todo 工具界面如下图所示。如果想试试紫色界面,又不想影响现有代码,这时候就可以用上工作树。

蓝色界面效果

派生工作树的方式

新对话

如果是全新的对话,按照下图所示的方式,在这里勾选工作树即可。

在新对话开启工作树
已有对话

如果是已有对话,那么派生就会保留当前对话的全部上下文,因此有利于我们做一些改动和对比。我们可以如下图所示,选择派生到新工作树。

右键菜单中创建

你也可以在刚才介绍的本地派生对话入口,选择下方的选项来创建工作树。

使用工作树

工作树图标样式

如上图,工作树线程有一个分叉的小图标,表示这个线程对应一个工作树。例如,我们可以在这个工作树线程中把主题色改为紫色,如下图。但你会发现原来的线程并没有变化,依然是蓝色的。

在派生工作树中的紫色样式

这就是刚才说的:不同版本可以同时存在,互不影响。这样,我们就可以快速验证一些奇思妙想,同时不影响主线程中的任务。

合并线程

那么,假如我们很满意这些改动,想要应用它们,该如何做呢?那就要合并线程!

假如我们现在很满意这个紫色的品牌色,那么就要合并。我们可以看到,这里显示的不是本地,而是工作树,然后点击“移交至分支”。

在之前的版本中,合并也有图形界面,但现在已经没有了,因此我们只能让 Codex 帮我们进行合并。

帮我把这个工作树的改动合并到主分支上

我不建议直接合并到 main 分支,更建议先把改动合并到一个 Git 分支上,再合并到 main 分支。

下一步

现在工作区里的线程越来越多,显得有些杂乱。特别是那些已经用不上的工作树线程,该怎么处理呢?