
命令行里git status、git add -p、git rebase -i用得飞起的人第一次在 PyCharm 里点开右下角那个分支名字时往往会愣一下这些操作在图形界面里到底对应哪条命令点下去会不会出事反过来一直用 PyCharm 图形化版本控制、分支管理的人切回命令行又常常心里没底觉得自己是在盲操作。这中间的落差其实不是能力问题而是没人把界面元素和 Git 底层命令的对应关系讲清楚。这篇内容就干这一件事把 PyCharm 的 Git 版本控制与分支管理拆成可对照、可复现的操作链路。从仓库初始化、忽略规则、拆块提交到分支创建切换、Merge 与 Rebase 的取舍、三窗格冲突解决再到历史追溯和误操作救火每一步我都会说明它在命令行里等价于什么、为什么这么设计、什么时候会翻车。适合两类人看一类是刚开始用 IDE 做团队协作的新手另一类是命令行熟手但想搞清楚 PyCharm 到底在背后干了什么的老兵。全程基于常见实践补充细节你手上的版本如果界面有差异以自己 IDE 的实际显示为准。1. 图形化 Git 不是黑箱面板与命令的对应关系1.1 先搞明白 PyCharm 只是 Git 的一层壳很多人对 IDE 里的 Git 有天然的不信任感觉得看不见命令就不可控。实际情况恰好相反PyCharm 本身不实现版本控制逻辑它只是调用你系统上安装的 Git 可执行文件然后把命令输出解析成界面。你在 Commit 面板里勾选几个代码块点提交它在背后执行的就是一条带路径参数的git commit你在分支弹窗里点 Rebase它执行的就是git rebase。理解了这一层界面上任何一个按钮你都能反推出它的命令风险也就变得可评估了。验证方法很简单打开 Git 工具窗口里的 Console 标签页你在图形界面做的每一次操作都能在这里看到对应的命令和输出。我习惯在处理复杂合并之前先把这个 Console 面板开着操作完回头扫一眼执行了什么。这个习惯救过我两次一次是发现某个撤销按钮实际执行的是硬回退一次是发现提交时 IDE 自动加了签名参数导致钩子行为不同。配置入口在 Settings 里的 Version Control 分组第一项 Git 会显示当前检测到的可执行文件路径和版本号。如果这里显示Git not found说明系统 PATH 没配好手动指定安装目录下的可执行文件即可。版本上有一点值得注意Git 2.23 之后git checkout被拆成了git switch和git restore较新的 IDE 版本在切换分支时调用的已经是git switch如果你机器上的 Git 版本太老某些操作会静默失败或者报错信息很奇怪。团队统一环境的时候把 Git 版本也纳入约定范围能省掉很多莫名其妙的排查。1.2 三个入口各管什么别混着用PyCharm 里跟 Git 相关的界面主要分布在三个地方职责其实分得很清楚混用会让人抓狂。入口主要职责典型操作提交工具窗口Commit管理待提交的改动勾选代码块、写提交信息、提交并推送Git 工具窗口Log查看与操作提交历史查看分支图、Cherry-Pick、Revert、Reset右下角分支菜单分支级操作新建、切换、合并、变基、拉取底部状态栏还有几个容易被忽略的信息当前分支名、是否有未推送提交向上的箭头数字、是否有未拉取提交向下的箭头数字。我见过不少人只看提交按钮不看状态栏结果在落后远端十几个提交的分支上继续写代码最后合并时冲突爆炸。养成一个习惯动手写代码前扫一眼状态栏的箭头向下的数字不为零就先更新。编辑器里的文件名颜色也是信息源。默认配色下未纳入版本控制的文件是红色新加且已暂存的是绿色修改过的是蓝色被忽略的是灰褐色。这套颜色可以在 Settings 的 Version Control 下的 File Status Colors 里改团队里如果有人用深色主题有人用浅色主题统一一下配色方案能减少沟通成本。至于每个文件具体改了哪几行看行号右侧的变更标记条就够了绿色竖条是新增行蓝色是修改行灰色小三角是删除位置点一下能看到该行的原始内容。1.3 为什么建议先在 IDE 里熟悉再回命令行有个观点我想说清楚图形化版本控制不是新手拐杖它是降低认知负荷的工具。分支合并这类操作冲突文件可能几十个在命令行里你要反复git status看还剩哪些没解决在 IDE 里左侧列着所有冲突文件解决一个划掉一个进度一目了然。再比如拆块提交命令行的git add -p要一个个 chunk 交互式回答 y/nPyCharm 里直接勾复选框视觉上还带着 diff 高亮。但反过来说完全依赖界面也有代价。有几种情况命令行明显更顺手批量操作比如给二十个文件同时打补丁、复杂的交互式变基、需要精确控制提交时间的场景、以及排查为什么 IDE 显示的状态和实际不一致这类疑难杂症。我的建议是把界面当主力把命令行 Console 当兜底遇到界面做不到的事直接在 IDE 内置终端里敲命令两边共用同一个工作区互不冲突。2. 从零接入仓库初始化、忽略规则与第一次提交2.1 两种接入路径新建仓库还是克隆已有仓库新项目的起步方式取决于代码在哪。如果是本地已经有一堆文件、想纳入版本控制走 VCS 菜单里的Enable Version Control Integration选择 Git它会在项目根目录执行git init。注意这一步只是创建了.git目录还没有任何提交此时所有文件都是未跟踪状态。如果代码已经在远端仓库里走Get from VCS填仓库地址选择本地目录它会执行git clone并自动把项目配置好这是团队协作里最常见的路径。一个容易踩的细节初始化仓库的位置。如果你只有某个子目录需要版本控制而项目根目录是另一个更大的目录一定要在正确的层级执行初始化。我见过有人在用户主目录下误执行了初始化结果一个git add .把整个家目录的东西都想加进去.git目录膨胀到几个 G。所以初始化之后第一件事永远是确认根目录对不对看一眼 IDE 里显示的项目根和.git目录是否在同一层。克隆路径上还有个凭证问题。用 HTTPS 地址克隆时第一次推送会让你输入账号密码或者令牌用 SSH 地址则需要提前配好密钥对把公钥上传到远端。IDE 在 Settings 的 Version Control 下的 Git 配置里可以指定 SSH 可执行文件Windows 上尤其要注意这一点系统自带的和 Git 安装包里带的那份可能不是同一个选错了会出现命令行能推、IDE 推不了的怪现象。2.2 忽略规则要在第一次提交前写好.gitignore这个东西最理想的创建时机是第一次提交之前。事后再补不是不行但已经进了历史的文件不会因为加了忽略规则就消失你还得额外执行一次从索引里移除的操作多绕一圈。PyCharm 新建.gitignore文件时可以选模板Python 项目选 Python 模板会带上一堆常见产物目录另外还有专门针对 IDE 配置目录的模板可以叠加使用。关于.idea目录到底要不要提交这是团队协作里争论最多的话题之一我的实践结论是拆开看不要一刀切。整个目录要么全提交要么全忽略这两种极端做法都有问题。路径是否提交理由.idea/workspace.xml不提交记录个人窗口布局、打开的文件、运行状态每人不同.idea/shelf/不提交本地搁置的改动纯个人数据.idea/codeStyles/建议提交统一代码风格避免格式化产生大量无意义 diff.idea/inspectionProfiles/建议提交统一静态检查规则.idea/dictionaries/建议提交团队共享拼写词典.idea/vcs.xml建议提交版本控制映射关系.idea/*.iml视情况模块配置文件Maven/Gradle 项目通常由构建工具生成可忽略实际操作上可以在.gitignore里先写.idea/*全忽略再用取反规则把需要共享的子目录放出来类似.idea/codeStyles前面加感叹号。这套写法新手容易写错顺序记住一条取反规则必须写在忽略规则之后且父目录被忽略时子目录的取反往往失效稳妥做法是把父目录写成.idea/*带星号而不是.idea/不带星号。临时想忽略某个已跟踪文件的改动别去改.gitignore用git update-index --skip-worktree这类索引级手段或者干脆用 IDE 的 Shelve 把改动收起来。改忽略规则影响的是所有人索引标记只影响你自己。2.3 第一次提交前必须过的三个检查第一次提交的坑最集中因为这时候项目结构和团队约定都还没定型。我在带人的时候会强制要求走完这三步。第一步看一眼完整的变更列表。打开提交工具窗口确认列出来的文件都是你想提交的。这里最容易出错的是那些自动生成的东西虚拟环境目录、编译产物、本地配置文件、日志文件、数据库文件。有一次一个同事把本地调试用的 SQLite 数据库文件提交上去了后面每次跑测试都会产生变更天天在变更列表里碍眼追了两周才彻底清理干净。第二步检查换行符。这是跨平台协作的第一大坑Windows 上默认换行是 CRLFLinux 和 macOS 上是 LF。如果团队里有人用 Windows 有人用 Mac不加约束的话一个文件可能因为换行符不同被整篇标记为修改diff 根本没法看。解决方式有两条路一是在 Git 配置里设core.autocrlfWindows 设true提交时转 LF检出时转 CRLFmacOS 和 Linux 设input提交时转 LF检出时不变二是更推荐的做法在仓库根目录加一个.gitattributes文件显式声明各类文件的换行符策略让规则跟着仓库走而不是跟着每个人的机器走。PyCharm 的设置里也有单独的换行符选项位置在编辑器代码风格那一栏但它影响的是新建文件历史文件的换行符还是得靠 Git 层配置来统一。第三步确认提交身份。提交信息里的作者名和邮箱来自 Git 全局配置如果这台机器是共用的或者你之前配过别的身份提交记录上就会挂错名字。在 IDE 的终端里执行git config user.name和git config user.email确认一下需要改就在仓库级别重新设一遍仓库级配置优先级高于全局。3. 提交面板的精细化操作拆块提交、改历史与提交前检查3.1 部分提交把一次改动拆成几个干净的提交有条经验值得反复强调提交的粒度决定了他日排查问题的成本。一次提交里塞进三个不相关的改动将来要回退其中一个你就得手工拆。PyCharm 的提交面板在这一点上给的能力比命令行直观得多。在提交工具窗口里每个文件左边有复选框展开文件后能看到具体的变更块chunk每个块左边也有复选框甚至单行都能勾。你勾选哪些提交时就只包含哪些剩下的留在工作区。这个操作背后等价于git add -p加git commit但省掉了交互式回答的繁琐。具体流程我一般这么走先写代码写完打开提交面板从上往下过一遍把属于同一个逻辑变更的块勾上写一条对应的提交信息提交。然后剩下的块继续分组。举个常见的场景你在实现一个新功能的过程中顺手修了一个拼写错误、又调整了一处配置。这应该是三个提交而不是一个。功能性改动、修正性改动、配置类改动混在一起提交将来做二分查找定位问题时那个大提交就是个黑盒。有个细节要注意同一行既有功能改动又有格式调整时行级勾选做不到拆分只能拆到块级。这种时候我的做法是先格式化再写功能或者反过来分开两次提交别硬拆。3.2 提交信息、检查项与提交并推送提交信息输入框上方的几个复选框价值比很多人以为的大。默认可能有优化导入重排代码运行代码分析之类的选项勾上之后提交前会自动跑一遍对应动作有问题会在提交对话框里提示。团队里如果有统一的代码规范把重排代码和优化导入勾上能避免格式化产生的 diff混进功能提交里。提交信息本身也值得规范一下。最基础的要求是首行简明扼要、不超过五六十个字符需要详细说明的话空一行再写正文。更进一步的可以在 Settings 的 Version Control 下的 Commit 配置里开启提交信息检查用正则约束格式比如要求以特定前缀开头。这个功能对小团队特别有用因为它在你点提交的那一刻就拦住不合规的信息比事后让人改历史容易一万倍。右下角的提交并推送是个双刃剑。它省了一步操作但也让提交和推送这两个语义不同的动作耦合在一起。我个人的习惯是本地提交随便做改错了还能撤推送一定要单独确认因为推上去的东西可能已经被别人拉走了。团队如果开了保护分支推送到受保护分支会直接被拒这时候还得回头处理不如一开始就分两步走。3.3 提交写错了怎么改Amend、Undo Commit 与交互式变基三种情况三种处理方式。刚提交完发现漏了一个文件或者提交信息写错了这时候用 Amend。在提交面板勾上要补的文件然后从提交按钮的下拉菜单里选修改提交它会把新内容并入上一次提交同时允许你改提交信息。背后执行的是git commit --amend。有个前提必须确认上一次提交还没推送到远端。如果已经推了改完之后本地和远端历史就不一致再推就得强制覆盖风险很大。提交本身想整个撤销退回工作区用 Undo Commit。快捷键是 CtrlAltZWindows/Linux效果等价于git reset --soft HEAD~1提交没了改动原样留在工作区文件状态回到已暂存。这个操作我几乎每天都在用尤其是在提交之后立刻发现这不该单独成一个提交的时候。如果是连续好几个提交都写乱了想合并、重排、改信息那就得用交互式变基。在 Git 工具窗口的 Log 面板里选中某个提交右键选从这里开始交互式变基弹出的表格里每一行是一个提交可以拖拽排序、标记为 squash合并到上一个、reword改信息、drop丢弃。这是 PyCharm 里少数几个比命令行更直观的操作因为命令行里rebase -i打开的是一个文本编辑器顺序和操作的对应关系全靠想象。提示交互式变基会重写提交哈希只对本地未推送的提交使用。已经推送到公共分支的提交用 Revert 生成反向提交不要动历史。4. 分支的创建、切换与合并右下角弹窗能做的和不能做的4.1 分支操作的完整清单与执行时机右下角的分支名点开是一个覆盖了绝大多数分支操作的面板。新建分支时它会问你要从哪个提交起头默认是当前 HEAD也可以手动指定某个历史提交。这里有个实用选项勾选检出表示创建后立即切过去不勾就只是创建。我倾向于勾上因为创建分支的目的通常就是要马上在上面干活。切换分支时最大的风险是工作区有未提交的改动。Git 会尝试把这些改动带过去如果目标分支上相同文件有冲突切换就会失败。PyCharm 在这种情况下会弹提示给你几个选择搁置改动Shelve、强制切换Smart Checkout、或者取消。Smart Checkout 的背后逻辑是把本地改动先 stash 起来切完再 pop 回去多数情况下能成功但如果 pop 时冲突你还得再解决一次。我的做法是切换分支前要么提交要么搁置别指望自动搬运。重命名和删除这两个操作看着简单其实有讲究。重命名只改本地分支名远端的旧名字还在需要单独推一次删除再推一次新分支或者在推送时留意提示。删除分支时未合并的分支会被拒绝删除IDE 会提示你该分支还有未合并的提交这时候要用强制删除。如果手滑删了一个还有用的分支别慌用 Reflog 能找回来这一点在第 6 节详细说。4.2 Merge 还是 Rebase在 IDE 里怎么选、怎么执行这个选择题的答案取决于分支性质不是个人偏好。我按场景给结论场景推荐方式原因功能分支同步主分支的最新代码Rebase保持功能分支提交线干净不产生一堆合并主分支的噪音提交功能分支合入主分支Merge或压缩合并保留功能开发的完整上下文出问题好回退整个功能多人协作的公共分支Merge不改写历史不影响别人本地临时分支整理Rebase把零碎提交压成有意义的几个执行 Merge 的入口在分支面板里先切到目标分支然后在面板里选中要合进来的分支选合并到当前分支。如果遇到冲突IDE 会弹出冲突解决界面处理完再提交。执行 Rebase 的入口在同一个面板里选中要变基到的分支选将当前分支变基到。变基过程中如果每个提交都有冲突会一段段停下来让你处理处理完点继续。这个过程比合并累人所以我一般建议在功能分支上频繁地做小规模变基别等积累了三十个提交再一次性变基那时候冲突会一层套一层非常难受。还有个常被忽略的配置更新项目时默认用合并还是变基。这个可以在 Settings 的 Version Control 下的 Git 配置里设对应到快捷键 CtrlT 的更新动作。团队里如果约定功能分支用变基、主分支用合并把这个默认值配好能省掉每次手动选择的麻烦。配错的表现是你明明想变基点了更新却发现多出一个合并提交。4.3 分支面板做不到的事不是所有分支操作都有界面入口。比如删除远端分支面板里虽然有入口但操作完远端引用不会立刻刷新需要手动执行一次拉取或者清理才能看到变化。再比如给分支设置上游追踪面板里能做但藏得比较深我通常直接在终端敲git branch --set-upstream-to。另一个盲区是多个工作区并行。Git 支持git worktree可以同时检出多个分支到不同目录这在需要一边跑测试一边改代码时特别有用。PyCharm 对 worktree 的支持是通过打开不同目录实现的不算真正的集成但能用。5. 冲突现场三窗格合并工具的逐行处理与验证5.1 冲突到底在冲突什么先把原理说透后面操作才有依据。合并两个分支时Git 会找到它们的共同祖先提交然后比较祖先到当前分支改了什么和祖先到目标分支改了什么。如果两边改的是同一块区域的同一批行或者一边改了一边删了Git 就不知道该听谁的把这块标成冲突两边的内容都塞进文件里用一串尖括号和等号分隔开等人工裁决。明白了这个模型你就知道冲突不是文件不同而是同一位置的改动无法自动调和。两个分支都改了同一个文件的不同位置Git 是能自动合并的压根不会找你。所以冲突文件数量多往往说明两个分支分叉的时间太长改动面重叠严重。减少冲突的根本办法是短分支、勤同步而不是冲突出现后处理得多快。冲突标记的样子是一排左尖括号标记当前分支版本一排等号分隔一排右尖括号标记合进来的版本。这三段在 PyCharm 里被渲染成可视化界面不用直接看这些符号。5.2 三窗格编辑器怎么读、怎么点双击冲突文件或者从冲突文件列表里点进去会打开合并编辑器。界面布局是三块左边是本地版本右边是外部版本中间是合并结果底部还有一个共同祖先版本。四个区域各有用处缺一不可。底部的祖先版本经常被忽略但它才是判断该保留谁的依据。比如左右两边都改了一行你需要知道原来是什么样才能判断哪边的改动是修正、哪边的改动是覆盖。没有祖先视图你只能靠猜。中间的结果面板上方有三个按钮分别对应接受左侧接受右侧接受合并结果。这里的措辞不同版本略有差异语义是全采用本地、全采用外部、采用你手工编辑后的内容。对于明显的场景直接点前两个就够了对于两边改动都要保留的情况就得在中间手动编辑把两段内容拼成想要的样子。自动解决按钮也值得一用它会对所有没有实质冲突的变更块批量应用合并只留下真正需要判断的块。几十个冲突文件的时候先用自动解决清掉简单的剩下的手工处理效率能差一倍。有些冲突涉及整段方法的删除和新增嵌套层级很深肉眼看容易晕。这时候把编辑器的折叠和差异高亮都用上折叠掉不相关的代码块只留冲突区域展开视野会清爽很多。5.3 解决完之后的三道验证冲突处理完不等于事情结束实际翻车往往发生在以为处理完了之后。第一道验证是标记已解决。在合并编辑器里点应用之后文件会从冲突列表里消失进入待提交状态。如果你直接在编辑器里手动删了冲突标记、保存关掉但没有走标记为已解决这一步Git 仍然认为这个文件处于冲突状态后续提交会报错提示还有未合并的路径。这个坑非常常见尤其是在编辑器里顺手改的时候。第二道验证是全文搜索冲突标记。冲突块处理不干净、残留半截标记的情况时有发生尤其是文件很大的时候。用全局搜索搜左尖括号连续七个字符正常应该零结果。这一步我每次解决完冲突都会做比事后测试报语法错误再回头找快得多。第三道验证是跑一遍构建或测试。有些冲突表现为代码能编译但逻辑错了比如两边各加了一个初始化调用合并后变成调用两次。这种问题只有跑起来才能发现。合并完成后先本地跑一遍测试再提交这个顺序别颠倒。真要是合并提交推上去之后才发现问题回退一个合并提交比回退普通提交麻烦得多。注意合并冲突期间不要执行拉取操作。Git 在合并未完成的状态下拒绝新的合并提示信息通常很含糊容易让人误以为是网络问题。6. 追溯与救火Log、Annotate、回退与误操作兜底6.1 Log 面板不只是看提交记录Git 工具窗口的 Log 标签页很多人只用来扫一眼提交列表其实它是信息密度最高的面板。顶部的过滤框支持按作者、日期、提交信息、路径组合过滤语法跟命令行参数类似。想查某个文件在最近三个月内被谁改过把文件从项目视图拖进去或者直接输入路径前缀就行。分支图那一栏值得展开说。勾选显示所有分支之后你会看到彩色的线条交缠在一起每个圆点是一个提交线条分叉表示分支创建线条汇合表示合并。看多了能一眼认出这个分支是从三个月前的老提交拉出来的一直没同步过主分支这类分支合并起来必然痛苦提前预警。右键菜单里的操作才是重点Cherry-Pick 把某个提交摘到当前分支Revert Commit 生成一个反向提交抵消某次改动Reset Current Branch to Here 把当前分支指针移到选中的提交还有前面提过的交互式变基。这些操作的入口都在右键里用熟了比在命令行拼参数快。6.2 Annotate定位某行代码是谁在什么时候改的编辑器左边行号区域右键选使用 Git 追溯注释有的版本叫 Annotate每一行左边会显示最后一次修改它的提交信息和作者。把鼠标悬停在某个注释上能看到完整的提交信息、时间、以及那次提交对这个文件的所有改动。这个功能在排查问题时的价值极高。举个例子某段逻辑突然开始报错你怀疑是参数变了用 Annotate 一查发现这行是上周某个提交改的点进去看那次提交的完整 diff发现连带改了别的地方问题一目了然。整个过程五分钟比满仓库翻代码快太多。进阶用法是追溯上一次修改。如果发现某行的改动是在做格式化没有实质变化可以继续往前追溯一直追到真正改了逻辑的那次提交。多次追溯能画出这个文件的修改脉络对于理解一段历史悠久的祖传代码特别有用。再看一眼状态栏和编辑器提示Annotate 视图是可以关掉的右键选隐藏注释就回到正常编辑。有些人不小心打开之后不知道怎么关一直带着一堆灰色小字写代码体验很差。6.3 三种回退方式的区别与选用这是最容易出事的地方因为三个操作的界面看起来差不多后果差别巨大。操作命令等价对工作区的影响对历史的影响适用场景撤销提交Undo Commitgit reset --soft HEAD~1改动完整保留抹掉最后一次提交刚提交完发现问题未推送回退提交Revert Commitgit revert hash自动生成反向改动新增一个抵消提交已推送到公共分支或需要留痕重置到此处Resetgit reset --mode hash取决于模式移动分支指针本地整理历史未推送Reset 又分三种模式IDE 在弹窗里会让你选软重置只移指针改动留在工作区混合重置移指针并清空暂存区改动留在工作区硬重置移指针并丢弃所有改动工作区回到目标提交的状态。硬重置是唯一一个会真正删掉你代码的操作做之前务必确认目标提交选对了且当前改动没有价值。什么时候用哪个我给个简单判断只要这个提交别人可能已经拉走了就只能用 Revert绝不能用 Reset。判断依据很简单看分支是不是公共分支看提交有没有推送。拿不准的时候先建一个临时分支指向当前位置再操作出问题还能切回去。6.4 手滑之后的两层兜底第一层兜底是 Reflog。Git 会记录每一次 HEAD 的移动即使你硬重置到一个老提交、或者删掉了一个分支那些提交对象在一段时间内仍然存在只是没有分支指向它们。在 Git 工具窗口的 Log 面板里分支下拉菜单里可以找到查看 Reflog 的入口也可以在终端执行git reflog。找到误操作之前的那条记录右键重置到那个位置或者新建一个分支指向它代码就回来了。第二层兜底是 IDE 的本地历史。这个功能跟 Git 完全无关是编辑器自己定期给文件拍快照记录在项目配置目录里。哪怕文件从来没提交过、哪怕 Git 仓库被整个删了本地历史依然能找回某天某个时刻的文件内容。入口在编辑器或项目视图的右键菜单里选本地历史下的显示历史。我遇到过最离谱的一次事故是有人把整个源码目录清空了Git 那边也没提交过最后靠本地历史恢复的。这个功能建议所有人都知道它在哪并且别把项目配置目录加进忽略规则之外的清理脚本里。最后说个小技巧。团队协作里提交信息和分支命名其实是低成本的沟通工具。分支名写成fix/订单列表分页错乱和写成dev2三个月后你自己都想不起来 dev2 是干什么的。我现在的习惯是分支名带上类型前缀和一句短语提交信息首行写清楚做了什么正文写为什么这么做。这套习惯坚持下来回头看 Log 面板的时候它就不只是一堆哈希而是一份能读的变更说明书。我在实际使用中最大的体会是PyCharm 的版本控制功能真正的价值不在于省掉几个命令而在于把状态可视化了。哪些文件改了、哪些提交没推、哪些冲突没解、当前在哪个分支这些信息在命令行里需要反复敲命令确认在界面里一眼就能看到。把这份可见性用好比记住多少个快捷键重要得多。