Git 版本管理
在项目工作区打开 Git 页面,可以可视化地管理代码版本。底部有三个标签页:状态、分支、提交。如果当前目录不是 Git 仓库,可一键初始化为空白仓库(默认分支为 main),或输入远程地址直接克隆已有仓库(1.12.0 起)。
右上角的钥匙图标进入「凭据与署名」页,内含署名和凭据两个标签页——首次使用必须先配好署名,否则无法提交。
状态
查看当前仓库的工作区状态。
顶部卡片显示当前分支名、相对远程领先或落后多少个提交(上下箭头),以及已暂存、已修改、未跟踪的文件数量。
提交是全宽的主按钮,需要先暂存改动并配好署名才能点击,点击后填写提交信息。
次级操作一行四个按钮:
- 暂存全部:把所有改动加入暂存区。
- 储藏(1.12.0 起):打开储藏箱,见下文「储藏」小节。
- 拉取 / 推送:需要已配置远程仓库。当前分支没有上游时,推送会自动建立关联。
分组标题右侧还有:
- 全部取消暂存:在已暂存分组,执行前会二次确认。此操作只取消暂存,不会删除文件内容。
- 全部回退(1.11.0 起):在已修改分组,把所有未暂存的改动还原成上次暂存或提交的内容。已暂存的内容不受影响,但丢弃掉的改动无法找回,执行前会二次确认。
文件改动按「已暂存 / 已修改 / 未跟踪」分成三组:
- 已暂存:点行查看暂存区与上次提交的差异,行尾「−」取消暂存。
- 已修改:点行查看工作区与上次提交的差异,行尾「+」暂存该文件。被删除的文件也在这一组,状态徽标是红色的 D。
- 未跟踪:点行查看这个新文件的内容(整份按新增显示),行尾「+」暂存。git 会把新建的目录折叠成一行(如
feature/),点它展开里面的文件,再点单个文件即可查看内容。
如果工作区有未提交的改动,点「拉取」会先提示可能产生冲突,确认后才执行。
提交弹窗(1.12.0 起增强)
点「提交更改」弹出的窗口里:
- AI 生成:点标题栏右侧的按钮,让 AI 读取暂存区与工作区的差异,自动生成一条符合 Conventional Commits 的提交信息。生成期间按钮显示「正在生成…」,生成失败会提示检查模型或网络。
- 快捷类型:输入框上方一排 Chip(
feat、fix、refactor、chore、docs、style、perf、test),点一下即把对应前缀套到当前信息上。 - 追加到上次提交(--amend):底部开关,开启后这次提交会合并进上一次提交,而不是新建一条。
合并冲突(1.12.0 起)
合并分支后如果产生冲突,状态页顶部会显示「检测到合并冲突」,并单独列出冲突文件(状态徽标为紫红色 U),提示你在编辑器中解决冲突后暂存,或点「中止合并」放弃本次合并、还原到合并前的状态。
储藏(1.12.0 起)
储藏用于临时收起当前改动、让工作区回到干净状态,之后再取回来。点状态页的「储藏」按钮打开储藏箱:
- 储藏改动:可填一句可选说明,并可勾选「包含未跟踪文件(-u)」把新文件也一并收起。
- 弹出 (Pop):取出这条储藏并把它从储藏列表移除。
- 应用 (Apply):取出内容但保留这条储藏记录。
- 丢弃 (Drop):删除单条储藏,执行前二次确认。
- 清空全部:删除所有储藏,执行前二次确认。
丢弃与清空都不可撤销。
回退与删除(1.11.0 起)
版本说明
状态页的长按操作菜单(回退改动、恢复文件、删除未跟踪项)与「全部回退」从 1.11.0 起提供;菜单里的「添加到 .gitignore」从 1.12.0 起提供。
长按任意文件行会从底部弹出操作菜单,菜单顶部显示完整路径。可用的操作按文件所在分组不同:
| 分组 | 菜单项 |
|---|---|
| 冲突文件 | 查看差异、暂存、复制路径 |
| 已暂存 | 查看差异、回退改动(还原到上次提交,已暂存和未暂存的改动都会丢失)、复制路径 |
| 已修改 | 查看差异、回退改动(还原成上次暂存或提交的内容)、复制路径 |
| 已修改中被删除的文件 | 查看差异、恢复文件(从上次提交把文件取回来)、复制路径 |
| 未跟踪文件 | 查看差异、添加到 .gitignore(忽略此文件 / 忽略同类型文件)、删除文件、复制路径 |
| 未跟踪目录 | 添加到 .gitignore(忽略整个目录)、删除目录、复制路径 |
两类操作的后果完全不同,注意区分:
- 回退改动 / 恢复文件:针对 Git 已经跟踪过的文件。内容存在版本库里,因此无论文件是被你删的、还是被终端命令或 AI 删的,都能取回来。代价是这次没提交的改动会丢失。
- 删除文件 / 删除目录:只出现在未跟踪项上。这些文件从来没进过版本库,删除后 Git 无法恢复。
所有回退和删除操作执行前都会弹确认框,说明将丢失什么。
分支
分成 HEAD、本地分支、远程分支、标签四组显示。当前分支卡片会显示分支名和三类引用的数量。本地分支按路径树形展示,当前分支高亮。
切换分支:点任意分支或标签,确认后切换。点远程分支会创建一个本地跟踪分支再切过去。切换到标签会进入 detached HEAD 状态(此时的提交不属于任何分支,注意不要在该状态下长期工作)。
点分支行弹出操作菜单:
- 切换:切到该分支。
- 合并分支(1.12.0 起):把该分支合并到当前分支,确认框里可选「创建合并提交(--no-ff)」。当前分支自身不显示这一项。
- 重命名:改本地分支名。
- 删除:本地分支使用安全删除,只能删已合并的分支;未合并的分支会被拒绝并给出原因。远程分支的删除会直接作用到远端,不可撤销。当前所在的分支不能删除。
新建分支:点本地分支分组标题右侧的 +,填分支名、选基准分支(默认当前分支),「创建并切换」开关默认开启。
标签:点标签分组标题右侧的 + 从当前 HEAD 创建轻量标签;点已有标签 → 操作菜单 → 删除可以删本地标签。
首次推送 master 分支的命名建议(1.12.0 起)
如果当前本地分支叫 master 且还没建立上游,第一次推送时会弹窗建议重命名为 main(GitHub、GitLab 的默认主分支)。可以选择「重命名为 main 并推送」,或「保留 master 推送」。
提交
显示最近的提交,带彩色的分支拓扑图。每条显示短哈希、作者、相对时间、提交信息,以及所在分支或标签的标记。
搜索过滤(1.12.0 起):列表上方有搜索框,输入关键词即可按提交说明、作者或短哈希实时筛选。
点一条提交会弹出底部详情面板:完整提交信息、作者与时间、完整哈希(短哈希和完整哈希都可以复制)、是否是合并提交,以及这次改动的文件清单。点文件可以查看该文件的差异。
详情面板上方还有一排深度操作(1.12.0 起):
- 分支:基于这条提交新建分支并切换过去。
- 标签:在这条提交上打标签。
- Reset:把当前分支重置到这条提交,可选
Soft(保留工作区与暂存区)或Mixed(保留工作区,清空暂存区)。
往下滚动接近底部时会自动加载更早的提交,全部加载完会显示「没有更多了」。
差异视图
点文件或提交查看差异时进入独立的差异页:
- 差异按带行号的
+ / −彩色显示,顶栏可以在编辑器中打开该文件(1.12.0 起),直接跳到代码编辑器对应文件。 - 单侧文件超过 2MB 时直接提示「文件过大」,不展示内容(二进制文件同理)。
超大输出
为保护手机内存,Git 页面不会将超大内容完整读入:状态、分支、提交列表等读取 git 输出超过上限时,会提示「输出过大,已截断,请缩小范围后重试」,不再尝试加载。
常见错误提示
操作失败时 Git 的原始报错会被翻译成中文提示。若某条错误没有对应翻译,会直接展示 Git 原文,方便排查。
| 场景 | 提示 |
|---|---|
| 当前目录不是仓库 | 当前目录不是 Git 仓库 |
| 仓库所有者异常 | Git 检测到仓库目录所有者异常(常见于外部存储),无法安全操作 |
| 仓库被占用 / 残留锁文件 | 仓库正被其他 Git 操作占用,请稍后重试 |
| 索引损坏 | Git 索引文件已损坏,请关闭后重新打开仓库 |
| 磁盘写入失败 | 无法写入仓库文件,请检查存储权限或剩余空间 |
| 删除当前所在分支 | 无法删除当前所在分支,请先切换到其他分支 |
| 删除有未合并提交的分支 | 该分支有未合并的提交,无法安全删除 |
| 新建分支重名 | 同名分支已存在 |
| 分支名不合法 | 分支名不合法 |
| 新建标签重名 | 同名标签已存在 |
| 删除不存在的标签 | 标签不存在 |
| 切换到不存在的分支/引用 | 分支、标签或提交不存在 |
| 操作的路径不存在 | 指定的文件或路径不存在 |
| 未跟踪文件会被覆盖 | 存在会被覆盖的未跟踪文件,请先移动或删除后再继续 |
| 切换时本地改动会被覆盖 | 本地有未提交的改动会被覆盖,请先提交或储藏后再切换分支 |
| 处于分离头指针状态 | 当前处于分离头指针状态,无法执行该操作,请先切换到某个分支 |
| 合并冲突 | 合并产生冲突,请前往状态页查看并解决冲突 |
| 存在未解决的冲突 | 存在未解决的冲突,请先解决冲突或中止合并 |
| 无共同历史 | 两个分支没有共同历史,无法合并 |
| 目标无法合并 | 无法合并:目标不是有效的分支或提交 |
| 无法快进 | 无法快进合并,存在分叉的提交,请改用普通合并 |
| 合并时本地有改动 | 本地有未提交的改动,请先提交或储藏(Stash)后再合并 |
| 未配置提交署名 | 尚未配置提交署名,请在设置中填写用户名和邮箱 |
| 无可提交改动 | 没有需要提交的改动 |
| 提交信息为空 | 提交信息不能为空 |
| 冲突未解决时提交 | 合并冲突尚未解决,无法提交 |
| 分支未关联远程 | 当前分支未关联远程分支,无法拉取 |
| 未指定拉取分支 | 未指定要拉取的远程分支 |
| 未配置远程仓库 | 未配置远程仓库,无法推送 |
| 本地无可推送提交 | 本地没有可推送的提交 |
| 本地与远程分叉 | 本地与远程分支已分叉,请先拉取合并或变基后再推送 |
| 推送被拒(远程有更新) | 推送被拒绝,远程有更新的提交,请先拉取 |
| 推送被远程拒绝 | 远程拒绝了本次推送,可能受分支保护或权限限制 |
| 远程分支不存在 | 远程分支不存在 |
| 远程仓库不可用 | 远程仓库不可用或无访问权限 |
| 远程鉴权失败 | 远程鉴权失败,请检查凭据配置(用户名/密码/Token) |
| 远程仓库不存在 | 远程仓库不存在或无访问权限 |
| 域名解析失败 | 无法解析远程主机地址,请检查网络或代理 |
| 连接失败或超时 | 连接远程仓库失败或超时,请检查网络或代理 |
| 连接中断 | 与远程仓库的连接中断 |
| 证书/TLS 失败 | 安全连接建立失败(服务器证书校验或 TLS 握手失败) |
| 克隆目录非空 | 当前工作区目录非空,无法直接克隆到当前目录 |
| 无改动可储藏 | 当前没有需要储藏的改动 |