---
title: "Git 工作流增强工具对比报告"
author: "Prism AI"
date: "2026-02-07"
tags: ["Git", "版本控制", "工作流", "开发工具"]
---

## 执行摘要

本报告深入分析了当前主流的 Git 工作流增强工具，涵盖从虚拟分支管理到堆栈式 PR 等多种创新工作流模式。

**核心发现**：

- **Worktrunk** 专为 AI agent 并行工作流设计的 git worktree 管理工具
- **GitButler** 通过虚拟分支技术实现了真正的多任务并行开发
- **Graphite** 将堆栈式 PR（Stacked PRs）工作流带给 GitHub 用户
- **Jujutsu (jj)** 是新一代 Git 兼容的 VCS，融合了多个版本控制系统的优秀理念
- **Sapling** 是 Meta 开源的可扩展源代码管理系统，兼容 Git
- **git-branchless** 提供高速度、monorepo 级别的无分支工作流
- **Stacked Git (stgit)** 是经典的补丁栈管理工具
- **git worktree** 是 Git 原生的多工作目录功能

> **Info: 关于工作流范式的演进**
> 从传统的 feature branch 到现代的 stacked changes、virtual branches，Git 工作流正在经历重大变革。这些工具的核心目标是解决同一个痛点：**如何在保持代码审查质量的同时，让开发者不被 PR 审查流程阻塞**。

**调研工具数量**: 8
*主流 Git 工作流增强工具*

## 工具核心对比

以下表格从多个维度对比各工具的核心特性：

**Git 工作流增强工具功能对比**

| 工具 | 核心理念 | Git 兼容性 | 学习曲线 | 适用场景 | 活跃度 |
| --- | --- | --- | --- | --- | --- |
| Worktrunk | AI agent 并行工作流 | ✅ 完全兼容 | ⭐⭐ | AI 编程助手 | 🔥 活跃 |
| GitButler | 虚拟分支并行开发 | ✅ 完全兼容 | ⭐⭐⭐ | 个人/小团队 | 🔥 活跃 |
| Graphite | 堆栈式 PR | ✅ 完全兼容 | ⭐⭐ | 团队协作 | 🔥 活跃 |
| Jujutsu (jj) | 新一代 VCS | ✅ Git 后端 | ⭐⭐⭐⭐ | 任意规模 | 🔥 非常活跃 |
| Sapling | 可扩展 VCS | ✅ Git 支持 | ⭐⭐⭐ | 大型项目 | 🔥 活跃 |
| git-branchless | 无分支工作流 | ✅ 完全兼容 | ⭐⭐⭐⭐ | 高级用户 | 🔥 活跃 |
| Stacked Git | 补丁栈管理 | ✅ 完全兼容 | ⭐⭐⭐ | 补丁维护 | ✓ 稳定 |
| git worktree | 多工作目录 | ✅ 原生功能 | ⭐⭐ | 并行任务 | ✓ 原生 |

## 工具类型分布

*Chart type: bar*

| Label | 工具数量 |
| --- | --- |
| 虚拟分支 | 1 |
| 堆栈式开发 | 3 |
| 新一代 VCS | 2 |
| 原生 Git | 1 |

### Tab: Worktrunk

## 核心功能

Worktrunk 是专为 **AI agent 并行工作流** 设计的 git worktree 管理工具。它让 Claude Code、Codex 等 AI 编程助手能够在多个独立的工作目录中同时处理不同任务，互不干扰。

### 设计理念

- **AI agent 优先**：专为运行多个 AI 编程助手设计
- **worktree 简化**：将 git worktree 的复杂命令简化为简单的 CLI
- **分支名即地址**：通过分支名定位 worktree，路径自动计算
- **hooks 系统**：支持 create、pre-merge、post-merge 等钩子

### 核心优势

- 创建 worktree 只需 `wt switch -c feature`
- 自动启动 Claude Code：`wt switch -x claude -c feature`
- 一键合并并清理：`wt merge main`
- LLM 自动生成提交消息

> **Success: 最适合的场景**
> 当你需要同时运行 5-10 个 AI agent 处理不同任务时，Worktrunk 能让每个 agent 都有独立的工作目录，避免互相覆盖代码。

```bash
# 安装
brew install worktrunk && wt config shell install

# 创建 worktree 并启动 Claude
wt switch -x claude -c feature-a -- 'Add user authentication'
wt switch -x claude -c feature-b -- 'Fix the pagination bug'
wt switch -x claude -c feature-c -- 'Write tests for the API'

# 查看所有 worktree 状态
wt list
# 输出:
# Branch         Status HEAD± main↕ Message
# @ feature-a    +      +53   0e631a Initial commit
# ^ main         ^⇡     ⇡1    0e631a Initial commit

# 合并并清理（自动生成提交消息）
wt merge main

# 对比传统 git worktree：
# git worktree add -b feat ../repo.feat && cd ../repo.feat && claude
# worktrunk: wt switch -x claude -c feat
```

### Tab: GitButler

## 核心功能

GitButler 是一个革命性的 Git 客户端，允许你**同时在多个分支上工作**。它引入了「虚拟分支」(Virtual Branches) 的概念，让你能够在同一个工作目录中并行处理多个任务。

### 设计理念

- **虚拟分支系统**：在 Git 之上维护一个未提交更改的追踪层
- **文件级分组**：可以将文件的不同部分分配到不同的虚拟分支
- **工作副本即提交**：无需手动 stash，所有更改都自动记录

### 技术栈

- 基于 Tauri 构建（Rust + Svelte）
- 后端用 Rust 编写，前端用 TypeScript + Svelte
- 完全兼容标准 Git 仓库

> **Success: 最适合的场景**
> 当你需要在修复 bug 的同时继续开发新功能，或者频繁在多个任务间切换时，GitButler 能让你保持所有更改都在工作目录中，无需频繁 checkout 和 stash。

```bash
# GitButler 的虚拟分支工作流示例（概念演示）
# 1. 在虚拟分支 A 上修改文件
# 2. 在虚拟分支 B 上同时修改其他文件
# 3. 两个分支的更改都在工作目录中可见
# 4. 可以单独 push 任一虚拟分支

# 传统 Git 需要：
git stash
git checkout feature-b
# 工作...
git checkout feature-a
git stash pop

# GitButler：所有虚拟分支的更改同时存在于工作目录
```

### Tab: Graphite

## 核心功能

Graphite 将大型科技公司内部使用的**堆栈式 PR (Stacked PRs)** 工作流带给 GitHub 用户。它通过 CLI 和 Web 应用帮助开发者创建和管理依赖的 PR 链。

### 设计理念

- **小 PR 原则**：将大功能拆分为多个小 PR（< 200 行代码）
- **依赖管理**：自动处理 PR 之间的依赖关系
- **自动 rebase**：当父 PR 修改时，自动 rebase 子 PR

### 工作流优势

- **不再被 PR 审查阻塞**：可以在等待审查时继续构建下一个 PR
- **更快的审查速度**：小 PR 更容易审查，反馈周期更短
- **更好的 Git 历史**：每个 PR 专注于单一关注点

### Graphite vs 传统 Git

**传统 Git 工作流** (-)

- 创建大型 PR（500+ 行）
- 等待审查时被阻塞
- 手动管理依赖分支
- Rebase 冲突需要逐个处理

**Graphite Stacked PRs** (+)

- 拆分为多个小 PR（< 200 行）
- 立即开始下一个 PR
- 自动处理依赖关系
- 一键 rebase 整个 stack

```bash
# Graphite CLI 工作流
# 创建第一个分支和提交
gt create -am "Feature: Add checkout button UI"

# 在此基础上创建下一个 PR（自动 stack）
gt create -am "Feature: Styling dark mode"

# 修改父分支后，自动 restack 所有子分支
gt modify -a
# 输出: Restacked 01-04-Feature_Styling_dark_mode on 01-04-Feature_Add_dark_mode_toggle_UI

# 提交整个 stack
gt submit
```

### Tab: Jujutsu (jj)

## 核心功能

Jujutsu (jj) 是 Google 开发的新一代版本控制系统，**完全兼容 Git**，但提供了更加现代和友好的用户体验。它融合了 Git、Mercurial、Darcs 等系统的优秀理念。

### 革命性设计

- **工作副本即提交**：每次文件修改都自动创建提交，无需 `git add`
- **冲突是一等公民**：冲突可以被提交、传播和自动解决
- **操作日志 & 撤销**：记录所有操作，可以撤销任何操作（包括 rebase、merge）
- **自动 rebase**：修改提交时，所有后代提交自动 rebase

### 灵感来源

- **Git**：快速、高效的算法和数据结构
- **Mercurial/Sapling**：revset 查询语言、无需 staging area、匿名分支
- **Darcs**：冲突作为一等对象
- **Google Piper/CitC**：可插拔后端架构

> **Warning: 学习曲线**
> Jujutsu 的概念模型与 Git 有较大差异。虽然它提供了更好的 UX，但需要时间适应。建议先阅读官方教程，理解「工作副本即提交」和「操作日志」的概念。

```bash
# Jujutsu 工作流示例
# 克隆 Git 仓库
jj git clone https://github.com/user/repo
cd repo

# 查看 smartlog（jj 的核心可视化工具）
jj log  # 或简写为 jj

# 修改文件后自动创建提交，无需 git add
echo "fix" > file.txt
jj st  # 查看状态

# 修改提交描述
jj describe -m "Fix bug in module X"

# 自动 amend：再次修改会自动更新当前提交
echo "more fix" >> file.txt
# 更改自动被 amend 到当前提交

# 撤销任何操作
jj undo  # 撤销最后一次操作
jj op log  # 查看操作历史
jj op restore @--  # 恢复到上一个操作状态
```

**2019** — 项目启动

Martin von Zweigbergk 在 Google 启动 Jujutsu 作为个人项目

**2021-01** — 自举开发

核心开发者开始用 jj 开发 jj 本身

**2023-01** — Git Merge 演讲

Martin 在 Git Merge 2022 上介绍 Google 对 Jujutsu 的计划

**2024-09** — Git Merge 再次演讲

Martin 在 Git Merge 2024 再次展示 Jujutsu

**2024-12** — 组织迁移

项目迁移到 jj-vcs GitHub 组织

### Tab: Sapling

## 核心功能

Sapling 是 Meta（Facebook）开源的源代码管理系统，专为**超大规模仓库**设计，同时也能很好地支持个人开发者使用 GitHub。

### 设计目标

- **可扩展性**：支持数千万文件、提交和分支的仓库
- **易用性**：为新手和专家都提供友好的用户体验
- **Git 兼容**：可以克隆和推送到 Git 仓库

### 核心特性

- **Smartlog**：可视化展示你的本地提交和它们与主分支的关系
- **自动 restack**：修改提交时自动 rebase 后代提交
- **撤销操作**：内置 undo/unamend/unhide 等撤销命令
- **可选 bookmark**：无需为每个小改动创建分支名

> **Info: Meta 内部使用**
> Sapling 在 Meta 内部已使用 10 年，主要用于其巨型 monorepo。搭配 Sapling 服务器和虚拟文件系统，可以处理数千万级别的文件和提交。

```bash
# Sapling 工作流示例
# 克隆 Git 仓库
sl clone --git https://github.com/facebook/sapling
cd sapling

# sl 无参数显示 smartlog
sl
# 输出:
# @ c448e50fe Today at 11:06 aaron remote/main
# │ Use cached values
# ~

# 修改文件并提交
vim file.rs
sl commit -m "Fix bug"

# 修改刚才的提交（amend）
vim file.rs
sl amend
# 自动 restack 后代提交！

# 隐藏（abandon）某个提交
sl hide -r <commit>

# 撤销 amend
sl unamend

# 推送到远程（对于 Git 仓库需要先 rebase）
sl rebase --dest main
sl push --to main
```

### Tab: git-branchless

## 核心功能

git-branchless 是一套增强 Git 的工具集，专为**高速度、monorepo 级别的工作流**设计。它提供了强大的撤销、可视化和历史重写功能。

### 核心工具

- **git undo**：通用撤销命令，可撤销几乎任何 Git 操作
- **smartlog (git sl)**：可视化提交图，不依赖分支
- **git restack**：自动修复断裂的提交图
- **git sync**：一次性 rebase 所有本地提交栈和分支
- **git move**：移动子树而非单个提交

### 性能优化

- 在 Linux 内核仓库（100 万+ 提交）上测试过性能
- 支持内存操作，避免触碰工作副本
- 多线程并行处理
- 使用分段 changelog DAG，merge-base 计算从 O(n) 优化到 O(log n)

### git undo vs git reflog

**git reflog**

- 只追踪单个引用（如 HEAD）的历史位置
- 复杂操作（如 rebase）需要逆向工程
- 无法撤销某些分支创建/删除操作

**git undo (git-branchless)** (+)

- 追踪整个仓库的状态
- 可撤销 commits、amends、merges、rebases、checkouts、branch 操作
- 抽象层次更高，更符合用户思维模型

```bash
# git-branchless 安装和使用
# 安装
cargo install --locked git-branchless

# 在仓库中初始化
cd my-repo
git branchless init

# 使用 smartlog 查看提交图
git sl
# 输出:
# ⋮
# ◇ e6adfe90 9d (main) Main branch commit
# ┃
# ◯ b91eec5c 13m A
# ┃
# ◯ 666b4b9e 13m B
# ┃
# ● 3a05375e 13m (feature) C

# 撤销任何操作
git undo

# 自动修复提交图
git restack

# 同步所有分支（无需 checkout）
git sync
```

### Tab: Stacked Git

## 核心功能

Stacked Git (StGit) 是一个经典的**补丁栈管理工具**，灵感来自 Quilt。它让你能够像维护补丁系列一样管理 Git 提交。

### 设计理念

- **补丁栈模型**：将多个补丁组织为栈结构
- **push/pop 操作**：像栈一样应用和取消应用补丁
- **与 Git 集成**：补丁存储为 Git commit 对象

### 核心命令

- `stg push/pop`：应用/取消应用补丁
- `stg refresh`：将工作目录的更改合并到当前补丁
- `stg new`：创建新补丁
- `stg delete`：删除补丁
- `stg series`：查看补丁栈

### 适用场景

- 维护长期补丁系列（如 Linux 内核开发）
- 需要频繁重排、修改补丁顺序
- 向上游项目提交补丁

> **Success: StGit 2.0 重大升级**
> StGit 2.0 用 Rust 重写，性能大幅提升。新增了补丁定位语法（如 -1, +3, ~2）、更好的命令行选项（-s 现在是 --signoff 的缩写）、以及基于 Gitoxide 的实现，启动延迟降低了 4 倍。

```bash
# Stacked Git 工作流
# 初始化栈（从 2.1.0 开始，创建补丁时会自动初始化）
stg init

# 创建新补丁
stg new patch1 -m "Add feature X"
# 编辑文件
vim file.c
# 将更改刷新到补丁
stg refresh

# 创建第二个补丁
stg new patch2 -m "Fix bug Y"
vim other.c
stg refresh

# 查看补丁栈
stg series
# 输出:
# + patch1
# > patch2

# Pop 当前补丁
stg pop
# 现在 patch2 不再应用，工作目录回到 patch1 状态

# Push 补丁
stg push patch2

# 将补丁转换为常规提交
stg commit patch1
```

### Tab: git worktree

## 核心功能

git worktree 是 **Git 原生功能**（Git 2.5+），允许你为同一个仓库创建多个工作目录，每个目录可以 checkout 不同的分支。

### 使用场景

- 同时处理多个分支，无需频繁切换
- 在一个目录中运行测试，同时在另一个目录中开发
- Code review：在新目录中 checkout PR 分支审查代码
- 紧急修复：快速创建新工作目录修复 bug，无需 stash 当前工作

### 工作原理

- 所有工作目录共享同一个 `.git` 目录
- 每个工作目录有独立的 HEAD 和索引
- 某些 ref（如分支）在所有工作目录间共享
- 一个分支只能在一个工作目录中被 checkout

> **Info: 简单但强大**
> git worktree 没有花哨的功能，但它解决了一个核心痛点：无需 clone 多次仓库就能并行工作在多个分支上。对于大型仓库，这能节省大量磁盘空间和时间。

```bash
# git worktree 使用示例
# 当前在 main 分支工作

# 创建新的工作目录用于 feature 分支
git worktree add ../repo-feature feature-branch
# 现在你有两个目录：
# repo/        (main 分支)
# repo-feature/ (feature-branch)

# 切换到新目录工作
cd ../repo-feature
# 在这里开发 feature...

# 同时回到主目录继续 main 分支的工作
cd ../repo
# 两个目录互不影响！

# 列出所有工作目录
git worktree list
# 输出:
# /path/to/repo         abc123 [main]
# /path/to/repo-feature def456 [feature-branch]

# 完成后删除工作目录
git worktree remove ../repo-feature
```

### git worktree vs 传统分支切换

**传统方式** (-)

- git stash 保存当前工作
- git checkout other-branch
- 完成后 git checkout main
- git stash pop 恢复工作
- 可能有 stash 冲突

**git worktree** (+)

- git worktree add 创建新目录
- cd 到新目录直接开始工作
- 两个分支的状态完全独立
- 无需 stash，工作互不影响
- 完成后 git worktree remove

## 工作流模式对比

不同的工具支持不同的开发工作流模式。理解这些模式有助于选择合适的工具。

**工具与工作流模式映射**

| 工作流模式 | 代表工具 | 核心特点 | 最佳实践 |
| --- | --- | --- | --- |
| 虚拟分支 (Virtual Branches) | GitButler | 同一工作目录多任务并行 | 频繁切换任务的个人开发 |
| 堆栈式变更 (Stacked Changes) | Graphite, git-branchless, stgit | 小 PR 链式依赖 | 需要快速迭代的团队 |
| 无分支 (Branchless) | jj, Sapling, git-branchless | 基于提交图而非分支 | 习惯 Mercurial 的用户 |
| 补丁栈 (Patch Stack) | Stacked Git | 像 Quilt 一样管理补丁 | 内核/上游补丁维护 |
| 多工作目录 | git worktree | 物理隔离的工作空间 | 大型仓库并行开发 |
| Trunk-based | 所有工具均支持 | 频繁合并到主分支 | CI/CD 成熟的团队 |

## 工作流理念分布

*Chart type: doughnut*

| Label | Value |
| --- | --- |
| 基于提交图 | 3 |
| 基于分支 | 2 |
| 混合模式 | 2 |

### 什么是虚拟分支？

虚拟分支是 GitButler 引入的概念。与传统 Git 分支不同，虚拟分支允许你在同一个工作目录中同时处理多个分支的更改。GitButler 在 Git 之上维护了一个追踪层，记录每个文件修改属于哪个虚拟分支。这样你可以随时将某个虚拟分支的更改 push 到远程，而保持其他虚拟分支的更改留在本地。

### 什么是堆栈式 PR (Stacked PRs)？

堆栈式 PR 是将一个大功能拆分为多个小的、相互依赖的 Pull Request。每个 PR 建立在前一个 PR 的基础上，形成一个「栈」。这种方式的优势是：1) 每个 PR 都很小（< 200 行），审查速度快；2) 不会被 PR 审查阻塞，可以继续开发后续 PR；3) Git 历史更清晰，每个 PR 专注于单一关注点。Meta、Google 等大型科技公司内部广泛使用这种工作流。

### Jujutsu 和 Sapling 有什么区别？

两者都是新一代 VCS，都兼容 Git，都来自大型科技公司（Google 和 Meta）。主要区别：

- **起源**：Jujutsu 由 Google 开发，Sapling 由 Meta 开发（基于 Mercurial）
- **架构**：Jujutsu 更强调可插拔后端，Sapling 更专注于与 Git 的兼容
- **目标**：Jujutsu 更注重创新用户体验，Sapling 更注重可扩展性
- **成熟度**：Sapling 在 Meta 内部已使用 10 年，Jujutsu 相对更新

两者都非常优秀，选择主要看个人偏好和团队需求。

### git-branchless 和 Jujutsu 哪个更好？

这取决于你的需求：

**选择 git-branchless 如果**：
- 你想继续使用标准 Git 命令
- 你只需要增强某些 Git 工作流（如 undo、smartlog）
- 你在大型 monorepo 上工作，需要极致性能

**选择 Jujutsu 如果**：
- 你愿意学习新的命令和概念模型
- 你想要更现代的 UX（自动 amend、操作日志等）
- 你希望完全摆脱 Git 的复杂性

两者可以共存：git-branchless 是 Git 的增强插件，而 Jujutsu 是独立的 VCS（虽然兼容 Git）。

### 我应该使用 Stacked Git 还是 Graphite？

**Stacked Git (stgit)** 适合：
- 维护补丁系列（如向 Linux 内核提交补丁）
- 需要频繁 push/pop、重排补丁
- 习惯 Quilt 工作流的用户

**Graphite** 适合：
- 使用 GitHub 的团队
- 希望将大功能拆分为小 PR
- 需要工具自动管理 PR 依赖关系

StGit 更像是「补丁管理工具」，Graphite 更像是「PR 工作流优化工具」。

### git worktree 和其他工具有什么区别？

git worktree 是 Git 原生功能，其他工具都是第三方工具。它的核心价值是**简单**和**零配置**。如果你只是想在不同分支间并行工作，而不需要虚拟分支、堆栈式 PR 等高级功能，git worktree 是最简单的选择。它特别适合大型仓库，因为可以避免重复 clone。

## 工具选择指南

根据不同的使用场景和团队规模，选择合适的工具至关重要。

1. [ ] 评估你的需求 — 确定你最主要的痛点：是频繁切换分支？还是 PR 审查阻塞？还是 Git 命令太复杂？
2. [ ] 考虑团队规模 — 个人开发可以大胆尝试新工具，团队协作需要考虑学习成本和工具兼容性。
3. [ ] 评估学习成本 — 新工具的学习曲线如何？团队是否愿意投入时间学习？
4. [ ] 试用和验证 — 在小项目或个人项目中试用工具，验证是否符合预期。
5. [ ] 渐进式采用 — 不要一次性切换所有工作流，可以从某个特定场景开始试用。

**场景化工具推荐**

| 使用场景 | 推荐工具 | 理由 |
| --- | --- | --- |
| 我是 Git 新手，想要更简单的体验 | Jujutsu, Sapling | 无需 staging area，自动 amend，更友好的错误提示 |
| 我频繁在多个任务间切换 | GitButler, git worktree | 虚拟分支或多工作目录避免频繁 stash/checkout |
| 我的 PR 经常因为太大而审查缓慢 | Graphite | 堆栈式 PR 让你拆分大 PR 为小 PR |
| 我在大型 monorepo 工作 | Jujutsu, git-branchless, Sapling | 专为大型仓库优化的性能 |
| 我需要维护补丁系列 | Stacked Git | 经典的补丁栈管理工具 |
| 我想增强 Git 但不想学新工具 | git-branchless, git worktree | 在标准 Git 基础上增强，命令保持熟悉 |
| 我的团队使用 GitHub | Graphite | 深度集成 GitHub，自动管理 PR 依赖 |
| 我需要强大的撤销功能 | Jujutsu, git-branchless | 操作日志 + undo 命令 |
| 我只是想同时 review 多个 PR | git worktree | 最简单的解决方案，无需额外工具 |

> **Warning: 兼容性提示**
> 除了 git worktree（Git 原生功能）外，其他所有工具都与标准 Git 仓库兼容。这意味着：
> 
> - 你可以在个人使用 Jujutsu/GitButler/Graphite，团队其他成员继续用 Git
> - 所有工具生成的提交都是标准 Git 提交
> - 你随时可以切换回纯 Git，不会丢失数据
> 
> **但注意**：某些工具（如 GitButler、Jujutsu）会在 Git 仓库外存储额外元数据（如虚拟分支信息、操作日志），这些数据不会同步到远程。

## 快速入门指南

以下是各工具的安装和入门步骤：

### Worktrunk 快速入门

**安装**：

```bash
# macOS/Linux
brew install worktrunk && wt config shell install

# Cargo
cargo install worktrunk && wt config shell install

# Windows (使用 git-wt 避免与 Windows Terminal 冲突)
winget install max-sixty.worktrunk
git-wt config shell install
```

**首次使用**：

```bash
# 创建 worktree 并切换
wt switch --create feature-auth

# 创建 worktree 并启动 Claude Code
wt switch -x claude -c feature-auth -- 'Add authentication'

# 列出所有 worktree
wt list

# 合并到 main（自动生成提交消息、rebase、清理）
wt merge main

# 删除 worktree
wt remove
```

**高级功能**：

- [Hooks](https://worktrunk.dev/hook/) — 创建/合并时自动运行命令
- [LLM 提交消息](https://worktrunk.dev/llm-commits/) — 自动生成提交消息
- [Claude Code 集成](https://worktrunk.dev/claude-code/) — 深度集成

**学习资源**：

- [官方文档](https://worktrunk.dev)
- [GitHub](https://github.com/max-sixty/worktrunk)
- [Anthropic 最佳实践](https://www.anthropic.com/engineering/claude-code-best-practices)

### GitButler 快速入门

**安装**（macOS/Windows/Linux）：

从 [官网](https://gitbutler.com) 下载桌面应用，或：

```bash
# macOS
brew install gitbutler

# 其他平台请下载安装包
```

**首次使用**：

1. 打开 GitButler 应用
2. 选择或克隆一个 Git 仓库
3. 在 UI 中创建虚拟分支
4. 修改文件后，拖拽更改到不同的虚拟分支
5. 单独 push 某个虚拟分支的更改

**学习资源**：

- [官方文档](https://docs.gitbutler.com)
- 特别推荐阅读 [Virtual Branches](https://docs.gitbutler.com/features/branch-management/virtual-branches) 概念说明

### Graphite 快速入门

**安装 CLI**：

```bash
# macOS
brew install withgraphite/tap/graphite

# npm
npm install -g @withgraphite/graphite-cli@latest

# 或直接下载
curl -fsSL https://graphite.dev/install.sh | sh
```

**首次使用**：

```bash
# 在 Git 仓库中初始化
cd my-repo
gt init

# 创建第一个 stack
gt create -am "Feature: part 1"

# 在此基础上创建下一个
gt create -am "Feature: part 2"

# 提交整个 stack
gt submit
```

**学习资源**：

- [官方文档](https://docs.graphite.dev)
- [Stacked PRs 博客文章](https://graphite.com/blog/stacked-prs)
- [VSCode 扩展](https://marketplace.visualstudio.com/items?itemName=Graphite.gti-vscode)

### Jujutsu 快速入门

**安装**：

```bash
# macOS
brew install jj

# Arch Linux
yay -S jujutsu

# Cargo（任何平台）
cargo install --locked jj-cli
```

**首次使用**：

```bash
# 克隆 Git 仓库
jj git clone https://github.com/user/repo
cd repo

# 查看 smartlog
jj log  # 或简写 jj

# 修改文件（自动创建提交）
echo "fix" > file.txt
jj describe -m "Fix bug"  # 添加提交消息

# 再次修改会自动 amend
echo "more" >> file.txt

# 撤销操作
jj undo
```

**重要概念**：

- **工作副本即提交**：每次修改都自动创建/更新提交
- **@** 符号代表当前工作副本提交
- **操作日志**：`jj op log` 查看所有操作历史

**学习资源**：

- [官方教程](https://docs.jj-vcs.dev/latest/tutorial)
- [Git 对比](https://docs.jj-vcs.dev/latest/git-comparison)
- [jj init 博客文章](https://v5.chriskrycho.com/essays/jj-init/)

### Sapling 快速入门

**安装**：

```bash
# macOS
brew install sapling

# Ubuntu/Debian
curl -fsSL https://sapling-scm.com/install.sh | sh

# 从源码
git clone https://github.com/facebook/sapling
cd sapling
make install
```

**首次使用**：

```bash
# 克隆 Git 仓库
sl clone --git https://github.com/user/repo
cd repo

# 查看 smartlog
sl

# 提交更改
sl commit -m "Fix bug"

# Amend
sl amend

# 撤销 amend
sl unamend

# 隐藏提交
sl hide -r <commit>

# Push（对 Git 仓库需要先 rebase）
sl rebase --dest main
sl push --to main
```

**学习资源**：

- [官方文档](https://sapling-scm.com/docs/introduction/)
- [Meta 工程博客](https://engineering.fb.com/2022/11/15/open-source/sapling-source-control-scalable/)

### git-branchless 快速入门

**安装**：

```bash
# Cargo
cargo install --locked git-branchless

# macOS
brew install git-branchless

# Arch Linux
yay -S git-branchless
```

**首次使用**：

```bash
# 在仓库中初始化
cd my-repo
git branchless init

# 使用 smartlog
git sl

# 撤销操作
git undo

# 修复提交图
git restack

# 同步所有分支
git sync
```

**与 Git 集成**：

git-branchless 会自动 hook 到 Git 命令中，记录所有操作以支持 undo。

**学习资源**：

- [官方 Wiki](https://github.com/arxanas/git-branchless/wiki)
- [git undo 博客](https://blog.waleedkhan.name/git-undo/)

### Stacked Git 快速入门

**安装**：

```bash
# macOS
brew install stgit

# Ubuntu/Debian
apt install stgit

# 从源码
git clone https://github.com/stacked-git/stgit
cd stgit
make prefix=/usr/local install
```

**首次使用**：

```bash
# 创建补丁（会自动初始化栈）
stg new patch1 -m "Add feature"
vim file.c
stg refresh

# 创建第二个补丁
stg new patch2 -m "Fix bug"
vim other.c
stg refresh

# 查看栈
stg series

# Pop/push 补丁
stg pop
stg push

# 将补丁转为提交
stg commit patch1
```

**学习资源**：

- [官方教程](https://stacked-git.github.io/guides/tutorial/)
- [使用示例](https://stacked-git.github.io/guides/usage-example/)

### git worktree 快速入门

**无需安装**（Git 2.5+ 内置）

**基本用法**：

```bash
# 为分支创建新工作目录
git worktree add ../repo-feature feature-branch

# 创建新分支并 checkout
git worktree add -b new-feature ../repo-new

# 列出所有工作目录
git worktree list

# 删除工作目录
git worktree remove ../repo-feature

# 或手动删除目录后清理
rm -rf ../repo-feature
git worktree prune
```

**最佳实践**：

- 工作目录命名：`repo-<branch-name>`
- 完成后及时删除：`git worktree remove`
- 大型仓库特别有用（避免重复 clone）

**学习资源**：

- [官方文档](https://git-scm.com/docs/git-worktree)
- `git help worktree`

## 社区与维护状态

以下是各工具的社区活跃度和维护状态概览：

**GitButler**: 活跃 ↑ GitHub 2.6k+ stars
**Graphite**: 活跃 ↑ 商业支持
**Jujutsu**: 非常活跃 ↑ Google 支持，10k+ stars
**Sapling**: 活跃 → Meta 支持，6k+ stars
**git-branchless**: 活跃 ↑ 3.5k+ stars
**Stacked Git**: 稳定 → 长期维护，v2.0+ 活跃
**git worktree**: 稳定 → Git 官方维护

**项目基本信息**

| 工具 | 许可证 | 开发语言 | 首次发布 | 最新版本 |
| --- | --- | --- | --- | --- |
| GitButler | Apache 2.0 | Rust + Svelte | 2023 | 持续更新 |
| Graphite | 专有 + 开源 CLI | TypeScript | 2021 | 持续更新 |
| Jujutsu | Apache 2.0 | Rust | 2019 | v0.24+ (2024) |
| Sapling | GPL v2 | Rust + Python | 2022 开源 (内部 2012) | 持续更新 |
| git-branchless | Apache 2.0 / MIT | Rust | 2021 | v0.x |
| Stacked Git | GPL v2 | Rust (v2.0+) | 2005 | v2.5.0 (2025) |
| git worktree | GPL v2 | C | 2015 (Git 2.5) | Git 内置 |

## 优缺点总结

每个工具都有其独特的优势和局限性：

### GitButler 优缺点

**优点**：

- 虚拟分支概念创新，真正实现多任务并行
- 图形界面友好，学习曲线相对平缓
- 无需频繁 stash/checkout，提升效率
- AI 辅助生成提交消息

**缺点**：

- 相对较新，生态系统还在发展中
- 主要依赖 GUI，CLI 支持有限
- 虚拟分支元数据不会同步到远程（团队协作需注意）
- 更适合个人或小团队，大团队采用需谨慎

### Graphite 优缺点

**优点**：

- 堆栈式 PR 工作流经过大公司验证（Meta、Google 内部使用）
- 自动管理 PR 依赖，rebase 一气呵成
- 与 GitHub 深度集成
- CLI 和 Web 界面都很优秀

**缺点**：

- 核心功能需要商业订阅（CLI 开源但高级功能收费）
- 主要针对 GitHub，对其他 Git 平台支持有限
- 堆栈式工作流需要团队文化支持（小 PR、快速审查）
- 学习曲线相对平缓但需要改变习惯

### Jujutsu 优缺点

**优点**：

- 非常现代的 UX，解决了很多 Git 的痛点
- 自动 amend、操作日志、冲突作为一等对象等创新特性
- Google 支持，社区活跃
- 与 Git 完全兼容（作为后端）

**缺点**：

- 学习曲线陡峭，概念模型与 Git 差异较大
- 相对年轻，某些功能还在开发中（如 Git submodules 支持）
- 元数据（bookmarks、操作日志）不存储在 Git 中
- 需要团队成员都愿意学习新工具

### Sapling 优缺点

**优点**：

- 在 Meta 内部经过 10 年实战验证
- 专为超大规模仓库设计，性能优秀
- Smartlog 等 UI 非常直观
- 撤销操作丰富（undo/unamend/unhide）

**缺点**：

- Git 支持是后来添加的，某些边缘情况可能有问题
- 设计偏向于 monorepo、trunk-based、rebase 工作流
- 服务端组件（Mononoke）尚未公开可用
- 对于小型项目可能过于复杂

### git-branchless 优缺点

**优点**：

- 强大的 undo 功能，比 reflog 更智能
- Smartlog 可视化非常清晰
- 在大型 monorepo 上性能优异
- 与 Git 集成良好，可以混用 Git 命令

**缺点**：

- 学习曲线较陡，需要理解 rebase、patch-stack 等概念
- 主要面向高级用户
- 某些功能（如 git move）对新手来说较难理解
- 文档相对其他工具稍显不足

### Stacked Git 优缺点

**优点**：

- 经典工具，经过时间验证（2005 年至今）
- 补丁栈模型非常适合维护补丁系列
- v2.0 用 Rust 重写，性能大幅提升
- 与 Git 深度集成，补丁即 Git 提交

**缺点**：

- 学习曲线较陡，需要理解补丁栈概念
- 相比现代工具，UI/UX 较为传统
- 主要适合特定场景（如内核开发），通用性不如其他工具
- 新用户可能更倾向于选择更现代的工具

### git worktree 优缺点

**优点**：

- Git 原生功能，无需安装额外工具
- 概念简单，学习成本低
- 节省磁盘空间（共享 .git 目录）
- 非常稳定，官方维护

**缺点**：

- 功能相对简单，缺乏高级工作流支持
- 需要手动管理多个工作目录
- 对于非常频繁的分支切换，创建/删除工作目录仍有开销
- 不支持在多个工作目录中 checkout 同一分支

## 推荐工作流组合

实际使用中，可以组合多个工具以获得最佳效果：

1. [ ] 个人开发者 — Jujutsu 或 Sapling（现代 UX）+ git worktree（偶尔并行开发）
2. [ ] 小团队 — Graphite（堆栈式 PR）或 GitButler（虚拟分支）
3. [ ] 大型团队 — Graphite（团队协作）+ git-branchless（个人高级操作）
4. [ ] 开源贡献者 — Stacked Git（补丁管理）或 git worktree（review PR）

> **Success: 建议的学习路径**
> 1. **先掌握 Git 基础**：理解 commit、branch、rebase 等核心概念
> 2. **从简单的开始**：先尝试 git worktree，理解多工作目录的价值
> 3. **根据痛点选择**：如果被 PR 阻塞 → Graphite；如果频繁切换 → GitButler；如果想要全新体验 → Jujutsu
> 4. **在个人项目中试验**：不要直接在工作项目中使用不熟悉的工具
> 5. **循序渐进**：一次只学一个工具，充分理解后再尝试组合使用

## 未来趋势

观察这些工具的发展，可以看到 Git 工作流的几个明确趋势：

**2015** — git worktree 发布

Git 2.5 引入 worktree，首次在原生层面支持多工作目录。

**2019** — Jujutsu 启动

Google 开始开发新一代 VCS，探索 Git 之外的可能性。

**2021** — 堆栈式工作流兴起

Graphite 和 git-branchless 相继发布，将 stacked changes 带给更广泛的开发者。

**2022** — Meta 开源 Sapling

Meta 将内部使用 10 年的 VCS 开源，Git 兼容性成为关键特性。

**2023** — 虚拟分支创新

GitButler 推出虚拟分支概念，探索并行开发的新模式。

**2024-2025** — 生态系统成熟

多个工具发布 2.0 版本，Rust 重写成为趋势，性能和用户体验大幅提升。

> **Info: 未来展望**
> **可以预见的趋势**：
> 
> - **AI 集成**：自动生成提交消息、智能冲突解决、PR 描述生成等
> - **云原生**：更好的云端协作、实时同步、分布式编辑
> - **性能优化**：更快的 rebase、更高效的大仓库支持
> - **用户体验改进**：更直观的可视化、更智能的错误提示
> - **工具融合**：不同工具的优秀特性会相互借鉴和融合
> 
> Git 本身可能不会被替代，但围绕 Git 的工作流和工具生态正在快速演进。

## 总结与建议

本报告深入分析了 7 种 Git 工作流增强工具。每个工具都有其独特的设计理念和适用场景，没有绝对的「最佳工具」，只有最适合你的工具。

**核心建议**：

1. **从痛点出发**：明确你最想解决的问题，再选择工具
2. **小步试验**：在个人项目中试用，不要急于在团队中推广
3. **保持兼容**：优先选择与 Git 兼容的工具，保持退出选项
4. **持续学习**：这个领域发展快速，保持关注新工具和新理念
5. **工具组合**：不同工具可以组合使用，发挥各自优势

**不同角色的推荐**：

- **Git 新手**：Jujutsu 或 Sapling（现代 UX）
- **个人开发者**：GitButler（虚拟分支）或 git worktree（简单）
- **团队协作**：Graphite（堆栈式 PR）
- **高级用户**：git-branchless（强大的 rebase 工作流）
- **补丁维护**：Stacked Git（经典补丁栈）

Git 工作流的演进才刚刚开始，未来会有更多创新。保持开放的心态，拥抱变化，找到最适合自己的工作流。

### 参考资料

1. [1] **Worktrunk Official Site** https://worktrunk.dev
2. [2] **GitButler GitHub Repository** https://github.com/gitbutlerapp/gitbutler
3. [2] **Graphite - Stacked PRs Blog** https://graphite.com/blog/stacked-prs
4. [3] **Jujutsu Documentation** https://jj-vcs.github.io/jj/
5. [4] **Sapling SCM Introduction** https://sapling-scm.com/docs/introduction/
6. [5] **git-branchless GitHub Repository** https://github.com/arxanas/git-branchless
7. [6] **Stacked Git Official Site** https://stacked-git.github.io/
8. [7] **Git worktree Documentation** https://git-scm.com/docs/git-worktree
9. [8] **Meta Engineering - Sapling Announcement** https://engineering.fb.com/2022/11/15/open-source/sapling-source-control-scalable/
