---
title: "变更与代码评审：查看 Git 改动、AI 评审并提交"
description: "在 Halo 的「变更」里查看工作区 Git 仓库的改动和差异，让 AI 做快速评审或团队评审，再暂存、提交并推送。"
type: "how-to"
audience: ["developer"]
since: "3.0"
related: ["features/spaces", "features/agent-engines", "guide/from-claude-code"]
lang: "zh-CN"
canonical: "https://hello-halo.cc/docs/features/code-review.html"
last_updated: "2026-10-19T00:11:17+08:00"
source: "Halo 3.0.4 docs"
---
# 变更、代码评审与 Git

在 Halo 的「变更」里查看工作区 Git 仓库的改动和差异，让 AI 做快速评审或团队评审，再暂存、提交并推送。

::: say
> 把刚才的改动提交并推送

Halo 会在工作区里用自己的命令行运行 git：看一下改了什么，写好提交信息，提交后推送到远程仓库，再告诉你提交号。

**前提**：工作区文件夹是 Git 仓库，并且这台电脑上的 Git 已经能推送到这个远程仓库（比如你在终端里推送过一次）。
:::

AI 评审要在 **变更** 里点按钮开始，Halo 不能在对话里替你启动一次评审。

## 开始之前 {#before-you-start}

- 一个绑定了项目文件夹的 [工作区](https://hello-halo.cc/docs/features/spaces.html)，文件夹本身或它下一级的某个文件夹是 Git 仓库。
- Git 2.23 或更新版本，见 [安装 Git](#git)。
- 想用 AI 评审，还需要一个能用的 AI 模型，见 [模型与账号](https://hello-halo.cc/docs/features/models.html)。

## 打开变更 {#open-changes}

1. 在会话页，点顶栏的 **⋯ 更多 › 变更**（「评审、暂存并提交 Git 变更」）。也可以按 ⌃ ⇧ G（macOS）/ Ctrl Shift G（Windows、Linux）。在 macOS 上是 Control 键，不是 Command 键。
2. 窗口很窄或在 Android 应用里时，点顶栏的 **更多**，再点 **变更**。
3. 画布里打开一个变更标签页，顶栏显示仓库名和当前分支。

变更有三页，在标签页顶部切换：

| 页面 | 用来做什么 |
|---|---|
| **变更** | 文件列表、差异、暂存和提交 |
| **总览与评审**（带「AI」标记） | 改动统计、按文件夹分布，以及 [AI 评审](#ai-review) |
| **提交图** | 只读的提交历史，见 [提交图](#graph) |

每个工作区只有一个变更标签页。打开或切回这个标签页、Halo 窗口回到前台、点 **刷新** 时，内容会重新加载。你看着的时候有文件被改动，顶部会出现「N 个文件有新变更」，点 **刷新** 更新，点 **关闭** 忽略。Halo 不会在后台轮询，也不会在启动时运行 Git。

在对话里点评审任务卡片，也会打开变更。通过 [远程访问](https://hello-halo.cc/docs/features/remote-access.html) 打开的浏览器和 Android 应用也能用变更，Git 在运行 Halo 的那台电脑上执行。

![变更视图：中间是并排显示的差异，右边是分组的文件列表（已暂存的变更、变更）和提交框，按钮写着「提交 1 个已暂存文件」](https://hello-halo.cc/docs/images/features/code-review/changes-view.zh.webp)

没有工作区时，菜单里没有 **变更**。只想看 AI 在某一条回复里改了哪些文件，用回复下面的 [查看变更](#reply-changes)，不需要 Git。

## 找到哪些仓库 {#repositories}

Halo 在两个位置找 Git 仓库：工作区文件夹本身，以及它下一级的文件夹。

- 文件夹里有 `.git` 就算一个仓库。`.git` 是文件的情况（工作树、子模块）也算。
- 以 `.` 开头的文件夹和符号链接文件夹会被跳过，最多检查 1,000 个子文件夹。
- 更深层的仓库找不到。想看它，让工作区直接指向那个文件夹。

找到多个仓库时，顶栏的仓库名变成一个选择器，标题是「此空间中的仓库」，每一项显示分支和相对路径。工作区文件夹本身排在最前，其余按名称排序。

当前分支显示在仓库名旁边。HEAD 处于分离状态时显示「HEAD 分离于 <提交号>」，仓库还没有提交时显示「尚无提交」。变更里不能切换分支。

## 选择比较范围 {#compare}

点顶栏的比较范围（「比较：…」）选择要看哪一部分改动：

| 选项 | 比较的是 | 说明 |
|---|---|---|
| **未提交的变更** | HEAD 和工作区文件，包括未跟踪的新文件 | 默认选项 |
| **已暂存的变更** | HEAD 和暂存区 | — |
| **自上次评审以来** | 上次开始 AI 评审时的文件和现在 | 还没评审过时不能选，提示「请先进行一次评审」 |
| **与分支比较…** | 从当前分支和所选分支的分叉点到现在 | 从 **分支** 或 **远程分支** 里选，选择器注明「从分叉点开始比较」 |
| **与提交比较…** | 所选提交和现在的工作区文件 | 从 **标签** 或 **最近的提交** 里选 |

- 仓库还没有提交时，**与分支比较…** 和 **与提交比较…** 不能选。
- 选择器可以搜索，最多列出 60 项，提交号显示前 7 位。
- 选了分支或提交后，范围显示为「与 <分支或提交> 比较」。
- 在 [提交图](#graph) 里点一个提交，会多出一个范围「提交 <提交号>」：这个提交和它的第一个父提交比较。

没有改动时，变更显示「无变更」「没有已暂存的内容」「自上次评审以来没有变更」「与 <分支或提交> 无差异」或「空提交」。

## 文件列表 {#file-list}

在 **未提交的变更** 范围里，文件分成三组：**冲突**、**已暂存的变更**、**变更**。其他范围只有一组 **变更**。

- **冲突** 组注明「请在终端中解决这些问题，或让 AI 处理。」变更里不能编辑冲突。
- 用 **树形** / **列表** 切换显示方式，默认树形。
- 在「筛选文件（例如 src/**）」里输入路径筛选，点 **清除筛选** 恢复。
- **隐藏生成文件** 默认打开：隐藏锁文件、压缩文件、快照，以及在 `.gitattributes` 中标记为 `linguist-generated` 的文件。列表会显示「已隐藏 N 个生成文件」，点 **显示** 查看。
- 列表最多显示 5,000 个文件，超出时提示「正在显示前 N 个文件」。
- 文件列表的宽度可以拖动，双击分隔线恢复默认。画布较窄时，文件列表收进 **文件列表** 抽屉。

并排显示、折叠、列表宽度、树形和隐藏生成文件这些选择保存在当前设备上。

## 阅读差异 {#diffs}

差异按文件卡片从上往下排列。工具栏上有：

| 控件 | 作用 |
|---|---|
| **上一处变更** / **下一处变更** | 在改动之间跳转，快捷键 <kbd>Shift</kbd> <kbd>F7</kbd> / <kbd>F7</kbd> |
| **并排显示** | 默认打开。画布宽度不足 640 px 时改为单栏，提示「并排显示需要更宽的画布」 |
| **折叠无变更区域** | 默认打开 |
| **折叠所有文件** / **展开所有文件** | 一次收起或展开所有卡片 |

差异是只读的，不能在里面直接修改。要改文件，点 **在编辑器中打开**，文件会在画布的编辑器标签页里打开。

选中差异里的一段文字，可以 **添加到对话**，引用会带上文件、哪一侧和比较范围，见 [会话里的引用](https://hello-halo.cc/docs/features/conversations.html#references)。

大文件的限制：

| 情况 | 显示 |
|---|---|
| 某一侧超过 2 MiB | 「过大，无法显示（大小）」 |
| 二进制文件 | 「二进制文件」和大小 |
| 改动 1,500 行及以上，或生成文件 | 「差异较大 · N 行」，点 **加载差异** 才显示 |
| 整体差异非常大 | 「大型差异 · 一次显示一个文件」 |

## 暂存、取消暂存和丢弃 {#stage-and-discard}

1. 把鼠标移到文件行上。未暂存的文件有 **暂存** 和 **丢弃**，已暂存的文件有 **取消暂存**。
2. 要整组操作，点组标题上的 **全部暂存** 或 **全部取消暂存**。差异卡片上也有 **暂存文件** / **取消暂存文件**。
3. 暂存和取消暂存立即生效，不会确认。

冲突文件不能暂存、取消暂存或丢弃。变更里只能整个文件暂存，不能按代码块或按行暂存。

**丢弃** 每次都会先确认：

- 已跟踪的文件：「丢弃对 <文件名> 的变更？」「此操作在 Halo 中无法撤销。」只丢弃工作区里的改动，已暂存的部分保留。
- 未跟踪的新文件：「将 <文件名> 移至回收站？」「Git 中没有这个新文件的副本。你可以从回收站恢复它。」文件会移到系统回收站，不会被直接删除。

::: warning 注意
丢弃已跟踪文件的改动后，Halo 里没有撤销。没把握时先提交，或先复制一份。
:::

## 提交和推送 {#commit-and-push}

提交框在文件列表下方。它显示当前分支名，但不能在这里切换分支。

1. 暂存要提交的文件。
2. 在「提交信息（按 ⌘ ↵（macOS）/ Ctrl Enter（Windows、Linux） 提交）」里写提交信息。变更不会替你生成提交信息。
3. 点 **提交 N 个已暂存文件**，或按 ⌘ ↵（macOS）/ Ctrl Enter（Windows、Linux）。没有暂存文件时按钮提示「暂存要提交的文件」，没写提交信息时提示「输入提交信息」。
4. 想提交后立刻推送，点主按钮旁边的 ▾（**更多提交选项**），选 **提交并推送**。
5. 想改上一次提交，在同一个菜单里选 **修正上一次提交**。提交信息框为空时，沿用原来的提交信息。仓库还没有提交时不能选。

提交会运行仓库里的提交钩子。钩子拒绝时显示「提交钩子拒绝了本次提交。」，点 **显示输出** 查看原因。

推送时，分支已有上游就直接 `git push`；没有上游，就推送到 `origin`（或唯一的远程仓库）并设为上游。提交成功但推送失败时，显示「已提交 <提交号>，但推送失败」，提交仍然保留。

提交最长等 5 分钟，推送和拉取最长等 3 分钟。

## 同步和发布分支 {#sync}

分支名旁边的按钮显示 ↑待推送 ↓待拉取 的提交数。这些数字来自上一次获取（fetch），鼠标悬停时提示「计数来自上次获取。点击即可拉取并推送。」

点这个按钮，Halo 会：

1. 运行 `git pull --ff-only`，只做快进，不合并也不变基。
2. 本地有待推送的提交时，再推送。

点下就执行，不会确认。完成后提示「已与 <上游> 同步」。

分支还没有上游时，按钮显示 **发布分支**。点它会把分支推送到远程仓库并设为上游，完成后提示「已发布 <分支名>」。

不能快进时（本地和远程各有新提交），同步会停下，请在终端里合并，或在对话里让 AI 处理。

## 提交图 {#graph}

从 3.0.4 起，变更有第三页 **提交图**：只读的提交历史，每条分支线一条泳道，每次加载 300 个提交，往下滚动继续加载。

- 用 **所有分支** 选择要看的分支。
- 在「按作者筛选（Enter）」或「搜索提交信息（Enter）」里输入后按 <kbd>Enter</kbd>。
- 点一个提交，**变更** 页会显示这个提交和它第一个父提交的差异，比较范围变成「提交 <提交号>」，提交框里显示这个提交的标题。

提交图里不能检出或重置。

## AI 评审 {#ai-review}

AI 评审读当前比较范围里的改动和周边代码，写一份评审报告。它在这个工作区里新建一个评审对话，在后台运行：你当前的对话不受影响，也不会切到新对话。

1. 在变更里选好 [比较范围](#compare)，比如 **未提交的变更**。
2. 切到 **总览与评审**，找到 **AI 评审** 卡片（「将在此空间新建一个评审对话」）。
3. 点 **快速评审** 或 **团队评审**，评审立即开始，不会再确认。
4. 卡片上显示进度，并注明「你可以离开此页面」。想中止，点 **停止**。
5. 评审完成后，报告显示在卡片里。

| | 快速评审 | 团队评审 |
|---|---|---|
| 谁来评审 | 一个智能体读改动和周边代码，写出报告 | 三个智能体分别评审架构、回归问题以及性能与提示词，再相互质疑彼此的发现 |
| 通常耗时 | 1–3 分钟 | 5–15 分钟 |
| Token 消耗 | — | 约为快速评审的 4–6 倍 |
| 项目规范 | 先读 `AGENTS.md`、`CLAUDE.md` 等规范文件 | 同左 |

::: warning 注意
团队评审会启动 3 个子智能体，约消耗 4–6 倍 Token。评审用的是工作区平常用的模型和账号，费用由你的账号或 API 提供商收取。
:::

评审时 AI 只读不写：不改文件、不构建、不执行 Git 写操作。仓库里的内容只当作材料，不当作给 AI 的指令。范围里没有改动时不能评审（「没有可评审的变更」）。改动的文件超过 400 个时，多出的部分按文件夹汇总。团队评审暂时用不了时，卡片显示「团队评审暂不可用」；团队工具中途失败时，会退回一个评审者，报告里会说明。

### 读评审报告 {#review-report}

报告用界面语言写成，固定分为五部分：**结论**、**必须修**、**需要你决定**、**建议**、**结构摘要**。每条发现都标出 `路径:行号`，点链接打开那个文件的差异页。

卡片上的操作：

| 操作 | 作用 |
|---|---|
| **打开对话** | 打开评审对话。你可以接着说，比如「把必须修的问题改掉」 |
| **将完整报告添加到对话** | 把整份报告作为引用放进输入框 |
| **重新评审** ▾ | 再评审一次，选「快速评审 · 单个智能体」或「团队评审 · 3 个子智能体，消耗更多 Token」 |

卡片还显示评审时间、用时和 Token 数。评审之后文件又变了，卡片提示「基于 <时间> 时的变更，之后又有 N 个文件被修改。」

- 每次开始评审，Halo 会给当时的文件拍一个快照，**自上次评审以来** 范围就是和它比较。快照是 Git 里没有被引用的对象，`git gc` 可能清理掉它（默认约两周），之后显示「上次评审的快照已不可用」。
- 每个仓库只保留最近一次评审。删掉评审对话后，卡片显示「评审对话已被删除」。
- 评审对话是一个普通对话，标题是「评审 · <范围> · N 个文件」，出现在会话列表和 [任务面板](https://hello-halo.cc/docs/features/tasks.html) 里。第一条消息是评审任务卡片，点它回到变更的总览页。
- 报告不会作为行内批注写进差异里。

## 回复下的查看变更 {#reply-changes}

AI 在一条回复里用文件工具改了文件，回复下面会出现「修改了 N 个文件 · +增加 −删除 · 查看变更」。

1. 点 **查看变更**。画布打开一个只读的标签页，标题是「<时间> 的回复」，顶部写着「此回复中编辑了 N 个文件 · 只读」。
2. 每次编辑显示为一段差异，整文件写入显示写入的全部内容。
3. 点 **转到回复** 回到那条回复，点 **打开文件** 或 **在编辑器中打开** 查看文件。

这个视图不需要 Git，也没有仓库、比较范围、暂存和提交。它注明「仅显示通过文件工具所做的编辑，通过命令所做的修改不包含在内。」AI 用命令行改的文件，要在 [变更](#open-changes) 里看。

## 安装 Git {#git}

变更需要 Git 2.23 或更新版本。Halo 第一次需要 Git 时才去找它，不在启动时检查。找不到时，最多每 60 秒重新找一次。

#### macOS
Halo 依次查找 PATH 里的 `git`、`/opt/homebrew/bin`、`/usr/local/bin` 和 `/usr/bin`。

没装 Xcode Command Line Tools 的 Mac，`/usr/bin/git` 无法运行，变更显示「Git 无法在这台电脑上运行」。在终端里运行下面的命令，装完后点 **重试**：

```bash
xcode-select --install
```
#### Windows
Halo 依次查找 PATH 里的 `git.exe`、Halo 自己安装的便携版 Git、你为 Halo 指定的 Git Bash 旁边，以及 Program Files 和 LocalAppData 下的标准安装位置。

找不到 Git 时，变更显示「Git 未安装」。在桌面版里点 **安装 Git**，Halo 会下载便携版 Git，显示进度，装好后自动重试。通过远程访问打开时没有这个按钮，要在运行 Halo 的电脑上安装。Git Bash 的设置见 [安装 Halo](https://hello-halo.cc/docs/getting-started/install.html#git-bash)。

#### Linux
Halo 先查找 PATH 里的 `git`，再查找 `/usr/local/bin` 和 `/usr/bin` 等常见位置。找不到时，变更显示「Git 未安装」，用系统的包管理器装好 Git 后点 **重试**。

Halo 从不弹出账号密码、SSH 或 GPG 的输入框，联网的 Git 操作在后台运行，不会等你输入。推送前，先在终端里对这个仓库推送一次，让 Git 保存好凭据。

Halo 自动读取仓库时，不会运行仓库配置里指定的程序（过滤器、fsmonitor、外部 diff、textconv）。你点击的写操作按 Git 平常的方式运行，包括钩子、LFS 和凭据助手。

::: done
变更里列出了改动的文件，提交后这些文件从「未提交的变更」里消失；AI 评审卡片里出现带「结论」和「必须修」的报告。看到这些，就说明变更和 AI 评审都在正常工作。
:::

## 遇到问题 {#troubleshooting}

### 此空间不是 Git 仓库

Halo 只在工作区文件夹和它下一级的文件夹里找仓库。确认仓库在这两个位置之一，不是更深的目录，也不是以 `.` 开头的文件夹或符号链接。必要时在 [工作区](https://hello-halo.cc/docs/features/spaces.html) 里把文件夹改成仓库所在的文件夹。

### Git 未安装

按 [安装 Git](#git) 里你的系统操作。Windows 桌面版可以直接点 **安装 Git**。

### Git 无法在这台电脑上运行

macOS 缺少 Xcode Command Line Tools。在终端里运行 `xcode-select --install`，装完后点 **重试**。

### Git 需要你先登录。请在终端中推送一次，然后重试。

Halo 不会替 Git 输入凭据。在终端里对这个仓库运行一次 `git push`，按提示登录，然后回到变更再试。

### Git 还不知道你是谁

在终端里设置提交者信息，再提交：

```bash
git config --global user.name "zhangsan"
git config --global user.email "zhangsan@example.com"
```

### 无法快进。请在终端中合并，或让 AI 来完成。

本地和远程各有新的提交，同步只做快进。在终端里合并或变基，或者在对话里让 AI 处理，然后再点同步。

### 远程仓库有你尚未获取的提交。请先同步，再推送。

先点分支旁的同步按钮拉取，再提交并推送。

### 拉取会覆盖你未提交的变更

先提交或丢弃这些改动，再同步；也可以在终端里自己处理。

### 你当前不在任何分支上，因此没有可推送的内容

HEAD 处于分离状态。在终端里切换到一个分支，或让 AI 切换。变更里不能切换分支。

### 另一个 Git 进程正在使用此仓库

终端或其他工具正在操作这个仓库。等它结束后重试。

### Git 响应时间过长。请重试。

提交超过 5 分钟、推送或拉取超过 3 分钟没有完成。检查网络和提交钩子，然后重试。

### 「自上次评审以来」不能选

还没有做过 AI 评审，或上次评审的快照已被 `git gc` 清理。重新评审一次即可。

### AI 改了文件，回复下的查看变更里却没有

回复的变更视图只显示 AI 用文件工具做的编辑，命令行做的修改不在里面。打开 **⋯ 更多 › 变更** 查看仓库里的全部改动。

## 下一步 {#next-steps}

- [从 Claude Code / Codex 迁移](https://hello-halo.cc/docs/guide/from-claude-code.html)：用已有的订阅、`CLAUDE.md` 和技能在 Halo 里写代码
- [Agent 引擎](https://hello-halo.cc/docs/features/agent-engines.html)：选择 Claude Code、Codex 等引擎来执行编码任务
- [工作区](https://hello-halo.cc/docs/features/spaces.html)：把工作区指向你的项目文件夹
