mirror of
https://github.com/l0ng-ai/openidea.git
synced 2026-11-14 16:07:52 +00:00
The VCS guide said there is no git init action for an open project and listed it as unsupported. Git › Create Git Repository… runs git init in a chosen folder and registers the repository, so the guide now describes it next to Clone… and drops the unsupported entry. Co-authored-by: muutot <92625353+muutot@users.noreply.github.com>
251 lines
21 KiB
Plaintext
251 lines
21 KiB
Plaintext
---
|
||
title: "版本控制"
|
||
description: "使用内置的 Git 集成进行提交、分支、合并、变基、贮藏和查看历史。"
|
||
---
|
||
|
||
OpenIDEA 内置 Git 支持,Git 也是它唯一支持的版本控制系统。
|
||
|
||
仓库状态(状态、差异、Blame、日志)在进程内读取;所有修改仓库的操作都调用 `git` 可执行文件完成,因此钩子、凭据、签名和你的 Git 配置都和命令行下的行为一致。你需要先安装 Git。OpenIDEA 依次在 `OPENIDEA_GIT`、`PATH` 和常见安装位置中查找;也可以在 **设置 › 版本控制 › Git › Git 可执行文件路径** 中指定路径,并点击 **测试** 检查。
|
||
|
||
## 功能入口
|
||
|
||
| 位置 | 内容 |
|
||
| --------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
|
||
| **Git** 主菜单 | 提交、推送、拉取、获取、合并、变基、分支、标签、重置、工作树、日志、补丁、贮藏与搁置、当前文件操作、GitHub、远程、克隆。 |
|
||
| **提交** 工具窗口(左侧) | 本地更改、更改列表、提交消息,以及搁置和贮藏标签页。 |
|
||
| **Git** 工具窗口(底部) | **日志**、历史标签页、**控制台**(IDE 执行过的 Git 命令)、**工作树**。 |
|
||
| 分支微件(标题栏) | 当前分支,点击打开分支弹窗。 |
|
||
| **VCS 操作…** 弹窗 | 常用 Git 操作的集合。 |
|
||
| 项目视图、编辑器和标签页右键菜单中的 **Git** 子菜单 | 针对所选文件的操作。 |
|
||
|
||
| 操作 | macOS | Windows/Linux |
|
||
| -------------------------- | --------------- | ---------------------------- |
|
||
| 提交工具窗口 | `⌘0` | `Alt+0` |
|
||
| Git 工具窗口 | `⌘9` | `Alt+9` |
|
||
| VCS 操作… | `⌃V` | ``Alt+` `` |
|
||
| 分支… | 无 | ``Ctrl+Shift+` `` |
|
||
| 提交… | `⌘K` | `Ctrl+K` |
|
||
| 提交并推送… | `⌥⌘K` | `Ctrl+Alt+K` |
|
||
| 推送… | `⇧⌘K` | `Ctrl+Shift+K` |
|
||
| 更新项目… | `⌘T` | `Ctrl+T` |
|
||
| 回滚… | `⌥⌘Z` | `Ctrl+Alt+Z` |
|
||
| 显示差异 | `⌘D` | `Ctrl+D` |
|
||
| 添加到 VCS | `⌥⌘A` | `Ctrl+Alt+A` |
|
||
| 新建分支… | `⌥⌘N` | `Ctrl+Alt+N` |
|
||
| 下一个 / 上一个更改 | `⌃⌥⇧↓` / `⌃⌥⇧↑` | `Ctrl+Alt+Shift+Down` / `Up` |
|
||
| 最近的更改(本地历史记录) | `⌥⇧C` | `Alt+Shift+C` |
|
||
|
||
**使用 Git Blame 注解**、**显示 Git 日志**、**显示历史记录**、**拉取…**、**获取**、**合并…**、**变基…**、**贮藏更改…** 和 **解决冲突…** 没有默认快捷键,常用的话可以在[键位映射](/zh/guide/keymap)中自行分配。
|
||
|
||
## 获取仓库
|
||
|
||
- **Git › 克隆…** 打开 **克隆仓库**。填写 **URL:** 和 **目录:**,需要时勾选 **浅克隆,历史记录截断为** N 个提交。侧栏中的 **GitHub** 会列出你的 GitHub 仓库(见 [GitHub](/zh/guide/github))。
|
||
- 新建项目时,在新建项目对话框中勾选 **创建 Git 仓库**。
|
||
- **Git › 创建 Git 仓库…** 会在你选择的目录(默认是项目根目录)里执行 `git init`,并立即注册这个新仓库;在终端里创建的仓库同样会被识别。
|
||
|
||
OpenIDEA 会找到包含项目的仓库,以及向下最多四层的嵌套仓库(跳过 `node_modules`、`target`、`build` 等目录)。状态、提交、获取和更新覆盖所有仓库;分支和日志操作针对所选仓库。子模块显示为嵌套仓库,但没有子模块相关命令。
|
||
|
||
## 提交更改
|
||
|
||
**提交** 工具窗口按组列出更改:**合并冲突**、**更改**(每个更改列表一组)和 **未跟踪的文件**。选择 **视图选项 › 分组依据 › 暂存状态** 后,更改会分为 **已暂存的更改** 和 **未暂存的更改**。
|
||
|
||
<Steps>
|
||
<Step title="选择要提交的内容">
|
||
勾选要包含的文件。未跟踪的文件和冲突默认不勾选,并且只勾选活动更改列表中的更改。`Space`
|
||
切换所选项。部分暂存的文件只包含已暂存的代码块。
|
||
</Step>
|
||
<Step title="填写提交消息">
|
||
在消息框中输入。**提交消息历史记录** 按钮(或 `⌃M` / `Ctrl+M`)提供最近 20 条消息。合并、拣选或还原过程中,消息会从
|
||
Git 预先填入;其他情况下使用 `commit.template`。
|
||
</Step>
|
||
<Step title="提交">
|
||
点击 **提交**,或在消息框中按 `⌘Enter` / `Ctrl+Enter`。**提交并推送…**(在消息框中按 `⌥⌘Enter` /
|
||
`Ctrl+Alt+Enter`)会在提交后推送。
|
||
</Step>
|
||
</Steps>
|
||
|
||
勾选 **修改**(`⌃⌥M` / `Alt+M`)可以修正上一次提交,按钮会变为 **修正提交**。
|
||
|
||
双击文件(或按 `Enter`)查看差异;**预览差异** 会在树旁边直接显示。文件右键菜单包括 **显示差异**、**跳转到源代码**、**回滚…**、**添加到 VCS**、**添加到 .gitignore**、**暂存**、**取消暂存**、**移动到其他更改列表…**、**搁置更改…**、**创建补丁…**、**以补丁形式复制到剪贴板**、**显示历史记录**、**显示本地历史记录** 和 **使用 Git Blame 注解**。
|
||
|
||
### 部分提交
|
||
|
||
只想提交文件的一部分时,从提交工具窗口打开它的差异。每个变更块在边栏中都有 **包含在提交中** 复选框,取消勾选不想提交的块即可,树中该文件的复选框会变为部分选中。OpenIDEA 通过临时索引提交选中的块,工作区和暂存区都保持不变。选择粒度是代码块,不是单行。
|
||
|
||
习惯使用暂存区的话,差异工具栏里也有 **暂存更改 (git add hunk)**。
|
||
|
||
### 更改列表
|
||
|
||
更改列表用来给本地更改分组,不影响 Git。默认列表名为 **更改**,新的更改进入活动列表。更改列表按项目保存在 `.openidea/changelists.json` 中。
|
||
|
||
- **新建更改列表…**、**编辑更改列表…**(`F2` 或 `⇧F6` / `Shift+F6`)、**删除更改列表**、**设置活动更改列表**。
|
||
- **移动到其他更改列表…**(`⇧⌘M` / `Alt+Shift+M`),或者直接在列表之间拖动文件。
|
||
- 右键某个更改列表选择 **提交…**,只提交这个列表。
|
||
|
||
### 提交选项与检查
|
||
|
||
**提交** 按钮旁的齿轮按钮(**提交选项**)包含:
|
||
|
||
- **作者:**:以其他身份提交(`Name <email>`),以及 **签署提交**。
|
||
- **提交检查**:**重新格式化代码**、**优化导入**、**清理**(应用 fix-all 代码操作)和 **运行 Git 钩子**(关闭时加 `--no-verify`)。
|
||
- **高级提交检查**:**分析代码**(语言服务器报告的错误和警告)和 **检查 TODO**(新增行中的 TODO 和 FIXME)。
|
||
|
||
提交前,OpenIDEA 还会对以下情况发出警告:在分离 HEAD 或变基过程中提交、文件名在其他系统上可能有问题、文件大于 50 MB、CRLF 换行符。出现警告时第一次提交会被拦下,点击 **仍然提交** 继续。没有“运行测试”这一检查。
|
||
|
||
### 模态提交
|
||
|
||
在 **设置 › 版本控制 › 提交** 中关闭 **使用非模态提交界面** 后,就没有提交工具窗口了:**本地更改**、**搁置** 和 **贮藏** 变成 Git 工具窗口的标签页,**提交…** 会打开 **提交更改** 对话框。
|
||
|
||
## 编辑器中的更改标记
|
||
|
||
编辑器边栏会标出相对于 HEAD 新增、修改和删除的行。点击标记会弹出窗口,提供 **上一个更改**、**下一个更改**、**回滚**、**显示差异** 和 **复制原始文本**。光标位于已更改的行上时执行 **回滚…**,只回滚这些行。
|
||
|
||
## 回滚、添加与忽略
|
||
|
||
- **回滚…** 打开 **回滚更改**:选择文件,可选 **删除已添加文件的本地副本**。
|
||
- **添加到 VCS** 添加未跟踪的文件。新建或删除文件时,OpenIDEA 会询问是否在 Git 中添加或删除;可在 **设置 › 版本控制 › 确认** 中修改。
|
||
- **添加到 .gitignore** 把规则写入最近的 `.gitignore` 或 `.git/info/exclude`。
|
||
|
||
## 差异查看器
|
||
|
||
差异在编辑器标签页中打开。
|
||
|
||
| 操作 | macOS | Windows/Linux |
|
||
| ------------------- | ------------- | -------------------------- |
|
||
| 下一个 / 上一个差异 | `F7` / `⇧F7` | `F7` / `Shift+F7` |
|
||
| 下一个 / 上一个文件 | `⌃⇧→` / `⌃⇧←` | `Alt+Shift+Right` / `Left` |
|
||
| 接受左侧 | `⌃⌘→` | `Ctrl+Alt+R` |
|
||
| 接受右侧 | `⌃⌘←` | `Ctrl+Alt+A` |
|
||
| 跳转到源代码 | `F4` 或 `⌘↓` | `F4` |
|
||
| 差异设置 | `⇧⌘D` | `Ctrl+Shift+D` |
|
||
|
||
工具栏可以在 **并排查看器** 和 **统一查看器** 之间切换,并设置空白处理(**不忽略**、**修剪空白**、**忽略空白**、**忽略空白和空行**)、高亮方式(按词、按行或不高亮)、**折叠未更改的片段**、**同步滚动** 和 **对齐更改**。右侧是工作区文件时可以直接编辑,也可以 **还原更改** 或 **暂存更改 (git add hunk)**。边栏中的箭头可以把一侧的更改应用到另一侧。
|
||
|
||
其他比较方式:
|
||
|
||
- 对当前文件或文件夹使用 **与分支或修订比较…** 和 **与修订版比较…**(文件夹会显示变更文件列表)。
|
||
- **比较对象…**(在项目视图中按 `⌘D` / `Ctrl+D`)、**比较文件**、**比较目录**(可向左/向右复制)和 **视图 › 与剪贴板比较**。
|
||
|
||
## 分支
|
||
|
||
点击标题栏的分支微件(或 **Git › 分支…**)打开分支弹窗,输入文字即可搜索分支和操作。弹窗中有 **最近**、**本地**、**远程** 和 **标签** 分组,顶部有 **更新项目…**、**提交…**、**推送…**、**新建分支…** 和 **签出标签或修订…**。齿轮按钮可以切换按前缀分组、显示最近分支和显示标签。
|
||
|
||
选中分支(`→` 或 `Enter`)查看它的操作:
|
||
|
||
- **签出**、**从 '…' 新建分支…**、**签出并变基到 '…'**
|
||
- **与 '…' 比较**、**显示与工作树的差异**、**显示历史记录**
|
||
- **将 '…' 变基到 '…'**、**将 '…' 合并到 '…'**;远程分支还有 **使用变基拉取到 '…'** / **使用合并拉取到 '…'**
|
||
- **更新**、**推送…**、**重命名…**、**添加到收藏夹**、**删除**
|
||
|
||
如果本地更改阻止签出,可以选择 **智能签出**(贮藏、签出、再恢复)、**强制签出** 或 **不签出**。删除的分支可以通过通知中的 **恢复** 找回。
|
||
|
||
有多个仓库时,弹窗会显示所有仓库共有的分支,以及每个仓库各自的子菜单。
|
||
|
||
## 与远程同步
|
||
|
||
- **获取** 会获取所有仓库。OpenIDEA 还会在后台检查传入的提交(打开项目 20 秒后检查一次,之后每 15 分钟一次),见 Git 设置中的 **显式检查远程上的传入提交**。
|
||
- **更新项目…**(`⌘T` / `Ctrl+T`)以合并或变基方式拉取所有仓库,未提交的更改会先贮藏再恢复。只有开启 **更新前显示选项** 时才会显示 **更新项目** 对话框。
|
||
- **拉取…** 把选定的远程分支拉取到当前分支,可选 `--rebase`、`--ff-only`、`--no-ff`、`--squash` 等选项。
|
||
- **推送…**(`⇧⌘K` / `Ctrl+Shift+K`)列出待推送的提交及其文件。可以修改目标分支、选择远程,并选择 **强制 (with lease)**、**设置上游** 或推送标签。受保护分支(默认 `master; main`)禁止强制推送。推送被拒绝时,OpenIDEA 会提供合并或变基后重新推送。
|
||
- **管理远程…** 添加、编辑和删除远程。
|
||
|
||
HTTPS 密码和 SSH 口令通过对话框询问,可以选择记住;保存的 HTTPS 凭据列在 **设置 › 版本控制 › Git › 密码** 中。
|
||
|
||
## 合并、变基与冲突
|
||
|
||
**Git › 合并…** 和 **Git › 变基…** 打开对话框,提供常用的 Git 选项(`--no-ff`、`--ff-only`、`--squash`、`--no-commit`;`--onto`、`--rebase-merges`、`--keep-empty`)。合并、变基、拣选或还原进行中时,标题栏会显示一个微件,提供 **解决冲突…** 以及继续 / 中止;Git 菜单中的 **中止合并**、**继续变基**、**跳过提交**、**中止变基** 以及拣选、还原对应的操作也会变为可用。合并通过提交来完成。
|
||
|
||
出现冲突时,通知和 **冲突** 对话框会列出相关文件。对每个文件选择 **接受您的**、**接受他们的** 或 **合并…**。
|
||
|
||
**合并…** 打开三方合并编辑器:左侧是你的版本,中间是结果,右侧是他们的版本。
|
||
|
||
- 点击边栏中的箭头接受某处更改,点叉号忽略它。按住修饰键可以用某一侧解决整个冲突。
|
||
- 工具栏可以应用所有不冲突的更改(左侧、右侧或两侧)、**解决简单冲突**、任意比较其中两个版本,并显示剩余的更改和冲突数。
|
||
- 点击 **应用** 保存结果并标记为已解决,或者对整个文件选择 **接受您的** / **接受他们的**。
|
||
|
||
带冲突标记的文件顶部会显示横幅和 **解决冲突…**,冲突标记也会作为错误报告。在文本编辑器中,**接受您的(光标处的冲突)**、**接受他们的(光标处的冲突)**、**全部接受(光标处的冲突)** 可以逐个解决冲突。
|
||
|
||
## Git 日志
|
||
|
||
Git 工具窗口的 **日志** 标签页显示提交图。
|
||
|
||
- **过滤**:文本或哈希(支持正则和区分大小写)、分支、用户、日期和路径;**最近使用的过滤条件** 可以找回之前的过滤。
|
||
- **转到哈希/分支/标签**(在日志中按 `⌘F` / `Ctrl+F`)。
|
||
- **图形选项**:按日期、拓扑或传入优先排序;仅第一父提交;不显示合并提交。
|
||
- **视图选项**:引用显示方式、详情面板,以及列(**作者**、**日期**、**哈希**、**签名**、**GitHub 提交检查**)。
|
||
- 左侧的分支面板可以按分支过滤日志,并提供分支操作。
|
||
- 详情面板显示变更文件、提交消息、提交者、包含该提交的分支以及签名。
|
||
|
||
右键提交可以选择 **复制修订号**(`⌥⇧⌘C` / `Ctrl+Alt+Shift+C`)、**创建补丁…**、**拣选**、**签出修订**、**浏览此修订版本的仓库**、**与本地比较**、**将当前分支重置到此处…**、**还原提交**、**撤消提交…**、**新建分支…**、**新建标签…**、**在浏览器中查看** 等。选中两个提交时,**比较版本** 会比较它们。
|
||
|
||
### 改写历史
|
||
|
||
在日志中可以 **编辑提交消息…**、**修补提交…**、**压缩到…**、**丢弃提交**、**压缩提交…** 和 **从此处进行交互式变基…**。交互式变基对话框可以对提交执行 pick、reword、edit、squash、fixup、drop,并调整顺序。这些操作也可以用于已推送的提交:改写前会先确认,之后推送需要强制推送。受保护分支上已推送的提交不能被改写。
|
||
|
||
限制:交互式变基不支持包含合并提交的范围;**撤消提交…** 只能用于最新的提交(其更改会放回某个更改列表)。
|
||
|
||
### 标签、重置与工作树
|
||
|
||
- **Git › 新建标签…** 在某个提交上创建标签(填写消息时为附注标签)。日志中的 **新建标签…** 创建轻量标签。
|
||
- **Git › 重置 HEAD…** 和 **将当前分支重置到此处…** 支持 **软**、**混合**(默认)、**硬** 和 **保留** 四种模式。
|
||
- **Git › 新建工作树…** 和 **工作树…** 用于创建、列出、删除工作树,以及在新窗口中打开。
|
||
|
||
## 贮藏、搁置与补丁
|
||
|
||
**贮藏** 使用 `git stash`:
|
||
|
||
- **贮藏更改…**:填写消息,可选 **保留索引** 和 **包括未跟踪的文件**。贮藏总是包含全部更改,不能只贮藏部分文件。
|
||
- **取消贮藏更改…**:应用或弹出某个贮藏,恢复索引,或基于它新建分支。
|
||
- 提交工具窗口的 **贮藏** 标签页列出所有贮藏,可以应用、弹出和删除。
|
||
|
||
**搁置** 由 IDE 管理,以补丁形式保存在 `.openidea/shelf` 中:
|
||
|
||
- **搁置更改…**:选择文件并命名,之后这些更改会被还原。
|
||
- **取消搁置…**:以三方合并的方式把搁置(或其中某个文件)应用到你选择的更改列表。
|
||
- **搁置** 标签页列出所有搁置,支持查看差异、与本地比较、导出补丁、重命名和删除。
|
||
|
||
在 Git 设置中打开 **在同一个标签页中合并显示贮藏和搁置**,两者会显示在同一个标签页里。
|
||
|
||
**Git › 补丁** 包含 **创建补丁…**、**应用补丁…** 和 **从剪贴板应用补丁…**。
|
||
|
||
## Blame 与历史
|
||
|
||
- **使用 Git Blame 注解** 在边栏中逐行显示作者和日期(也可以从边栏右键菜单打开)。点击某条记录会在日志中打开对应提交。在 Git 设置中打开 **为当前行显示内联 Git Blame**,会在光标所在行末尾显示作者。
|
||
- 注解行的右键菜单中,**标注上一版本** 会打开该提交之前版本的文件(已注解),与这个提交的版本并排显示。
|
||
- **标注指定版本…** 可选择文件的任意版本,把该版本(已注解)与工作区文件并排显示。
|
||
- **显示历史记录** 在 Git 工具窗口的标签页中打开文件历史。
|
||
- **显示所选内容的历史记录** 列出修改过所选行的提交。
|
||
- **显示当前修订版** 在日志中定位光标所在行的提交。
|
||
|
||
### 本地历史记录
|
||
|
||
本地历史记录独立于 Git 保存文件快照,包括已删除的文件,以及重构前自动记录的状态等带标签的快照。
|
||
|
||
- **Git › 当前文件 › 本地历史记录**(或项目视图中的 **本地历史记录 › 显示历史记录**)打开文件或文件夹的历史。选中某个版本后点击 **还原**(已删除的文件为 **恢复**)。
|
||
- **添加标签…** 给当前状态打标记。
|
||
- **最近的更改**(`⌥⇧C` / `Alt+Shift+C`)列出整个项目最近的编辑。
|
||
|
||
保留策略在 **设置 › 外观与行为 › 系统设置** 的 **本地历史记录** 部分设置:默认保留 5 个工作日、每个项目 512 MB。超过 2 MB 的文件不会自动保存快照。
|
||
|
||
## 设置
|
||
|
||
**设置 › 版本控制** 包含以下页面:
|
||
|
||
| 页面 | 主要选项 |
|
||
| ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------- |
|
||
| **提交** | 非模态提交界面、提交后清空消息、提交消息检查(主题与正文之间空行、主题和正文长度、右边距)、默认提交检查。 |
|
||
| **确认** | 新建或删除文件时的处理方式、**更新前显示选项**、丢弃提交前确认、在项目视图中高亮包含修改的目录、历史记录行数上限。 |
|
||
| **目录映射** | 检测到的仓库(只读)。 |
|
||
| **问题导航** | 把提交消息中的问题编号变成链接的正则规则(内置 JIRA、YouTrack 和 GitHub 预设)。 |
|
||
| **日志** | 引用和时间的显示方式、显示哪些列。 |
|
||
| **搁置** | 应用后从搁置中移除文件。 |
|
||
| **Git** | Git 可执行文件、内联 Blame、提交警告、默认签署、推送选项和受保护分支、更新方式(合并或变基)、传入提交检查、已保存的密码、合并显示贮藏和搁置。 |
|
||
| **GitHub** | 见 [GitHub](/zh/guide/github)。 |
|
||
|
||
## 暂不支持
|
||
|
||
- Mercurial、Subversion、Perforce 等其他版本控制系统。
|
||
- 子模块命令、编辑目录映射。
|
||
- 按行的部分提交(只支持按代码块)以及按文件贮藏。
|
||
- 除大文件警告外的 Git LFS 支持。
|