关于idea里的 Enable staging area
一、背景
这篇文章研究 IDEA 中 Enable staging area 配置。该配置通常默认不开启,如下图所示。
说明:该选项将 IDEA 默认的 Changelist(变更列表)工作流切换为 Git 原生的暂存区(staging area / index)工作流;仅适用于非模态(non-modal)Commit 界面。

开启前后有什么差异?
开启 Enable staging area 前
Commit 窗口中的未提交文件带有复选框。此时 IDEA 以 Changelist(变更列表)展示本地改动,不会按 Git 的 Staged 和 Unstaged 状态分别显示;可以通过复选框决定本次提交哪些文件。

开启 Enable staging area 后
可以看到:
- 区分了
Staged和Unstaged,分别对应 Git 暂存区(index)中的改动与尚未暂存的工作区改动 - 文件列表不再通过复选框决定提交范围;需要先将要提交的改动加入
Staged

二、两者更多的区别
2.1、区分显示后,提交范围由 Staged 决定
不能再通过勾选框选择本次提交的文件。Staged 为空时,点击 Commit All 会将当前所有未暂存改动一并纳入本次提交;因此它不适用于按文件选择性提交。
如果要选择性提交 ,先将需要提交的文件加入 Staged,之后点击 Commit。此时 Commit 只会提交 Staged 中的内容。(注意 :当 Staged 中有内容时,Commit All 按钮会变为 Commit,如下图。)
除整个文件外,IDEA 还支持暂存代码块、单行等更细粒度的改动;因此也可以将同一个文件的不同改动分多次提交。

可以观察到
- 步骤 1:
Staged中没有文件,按钮显示为Commit All - 步骤 2:选中某个文件,执行
+ Stage,将它加入暂存区 - 步骤 3:
Staged中出现文件后,Commit All变为Commit,以避免误以为仍会提交全部改动 - 步骤 4:点击
Commit后,Staged中的文件已被提交。即使当时蓝色背景选中了Test.java(见步骤 3),提交范围也不是"当前选中的文件",而是Staged中的全部内容
其他补充
如果要将 Staged 中的文件取消暂存,使用 Unstage:它只会撤销暂存状态,不会丢弃工作区中的文件修改。其效果近似于:
bash
git restore --staged <file>
操作如下:

注意:启用该选项会禁用 Changelist 支持。如果原先依赖多个 Changelist 区分任务,切换前应先确认当前 IDEA 版本对已有 Changelist 的处理方式,并以设置页面的提示为准。
三、其他
前文描述的 "工作区和Stage区域的文件分开显示" 如何是如何设置的:
- File -> New Projects Setup -> Settings for New Projects... -> Version Control -> Git -> Commit 下面有个 Enable staging area
- File -> Settings... -> Version Control -> Git -> Commit 下面有个 Enable staging area
上面两种改法都等价, 都是全局生效的, 改其中一个会同步体现在另外一个位置