分支与手术

分支、远程与侧边栏

一条可以重新排序、可以搜索的侧边栏,装下了分支、远程、标签、贮藏、工作树和子模块。每个分区都能隐藏或调整顺序(设置 → 布局),而过滤框对所有分区都生效。 哪些分区和文件夹展开、哪些收起,会按仓库记住,重启后依然保留。

侧边栏是一叠窗格,不是一条长列表。打开的分区吃掉折叠分区剩下的高度,折叠的那些 以标题行待在下面;同时打开几个,就平分那块高度,各自滚动。有几百个标签的分区在 自己的窗格里滚动,其他标题留在原处,想点的东西不会被挤出屏幕。打开得比放得下的 还多,所有窗格一起缩到标题为止——侧边栏本身从不滚动。

还没整理过的仓库里,只有本地一开始是打开的;其他分区都以标题行开始。包含超过 300 个引用的分区照样默认折叠。在一个积压了数千个从未删除的远程分支的仓库里, 否则它们会在你没有要求的情况下铺满整个屏幕;展开一次,这个选择就会像其他选择一样 被记住。

侧边栏,置顶的分支被固定在最上方

分支

创建、检出、重命名和删除——本地和远程都行。分支行上会显示:

  • 相对其上游的 ↑领先 / ↓落后,
  • 各远程的存在徽标(哪些远程有这个分支),
  • 一次冲突雷达扫描之后的风险圆点,
  • 当远程重写过历史时的 ⟳ 标记。

名字里带 / 的分支会自动折叠成可收起的文件夹。 哪怕只有一个子项,前缀仍是文件夹——release/1.2.3 就是装着 1.2.3 的 release,以后再加 release/1.2.4 不会把树重画一遍。一串单子文件夹会收成 一条标题(dependabot/npm_and_yarn)。文件夹标题用文件夹标记;ref 本身用 分支、远程或标签标记。

右键点击文件夹标题可对整组操作:删除 feature 下的所有分支(4 个分支) 会在一次确认后删除其中的全部分支,确认框会准确列出哪些分支将被删除——你当前所在的分支除外。远程分支的文件夹上也有同样的菜单,只是删除的是远程上的分支。

工具栏中的分支下拉列表会列出本地和远程分支。右键点击下拉列表中的任意分支, 可以重命名本地分支、复制分支名、在新的工作树(worktree)中检出、将其合并到 当前分支,或删除它。远程分支不提供重命名,确认后会从其远程仓库中删除。 当所选引用已包含在当前分支中时,Gitcito 会隐藏合并选项;当该分支已被检出时, 会禁用创建工作树。

工具栏下拉列表中的本地分支操作

工具栏下拉列表中的远程分支操作

行可以像文件一样多选:⌘/Ctrl+点击切换一行,Shift+点击选中一段范围,Shift+↑/↓ 则从最后点击的那行开始扩展选择。在选中项上右键打开批量菜单——删除 4 个分支——确认框会列出完整名单。同样的手势也适用于远程分支、标签和贮藏。

用斜杠分隔的分支名折叠成一棵树

重命名分支

三天前叫 fix 的分支,今天谁也说不清它是什么。在你发现问题的地方直接改名:

位置 操作
侧边栏 右键点击分支 → 重命名…
工具栏分支下拉 右键点击分支 → 重命名…
提交图 右键点击提交上的分支徽标 → 重命名…
命令面板 ⌘/Ctrl+K → 重命名分支(作用于当前检出的分支)

本地重命名就是 git branch -m:立即生效,并且 可以用 ⌘Z 撤销 —— 撤销项会把 名字改回去。重命名你正处在的分支,你仍然停在这个分支上。

当分支跟踪着远程时,菜单还会提供 重命名(含远程)…:本地改名、推送新名字、 删除远程上的旧名字。这 无法撤销 —— 旧的远程分支已经不存在,检出过它的人得 自己重新指向。在图上的徽标里,只有当分支恰好跟踪一个远程时才提供此项;跟踪多个 时请在侧边栏选择分支,让上游没有歧义。

限制: Gitcito 不会重写任何引用旧名字的东西 —— 已打开的 PR 仍指向创建时的 分支,按分支名模式匹配的 CI 规则会不再匹配。重命名一个已在别的 工作树 中检出的分支会失败,git 会明说。

拉取和推送一个你没有检出的分支

右键点击任意本地分支,拉取和推送都作用于该分支,而不是当前检出的分支 —— 让三个分支跟上进度,不必来回检出。参见获取、拉取与推送。

置顶分支

给那些你总要回去的分支加颗星——把鼠标停在那一行点 ★,或者右键 → 置顶分支。它们会出现在「本地」分区顶部的置顶分组里,按仓库分别记住,同时仍然留在下面它们原本的位置上。

检出一个远程分支

双击一个远程分支,就会创建跟踪它的本地分支。如果同名的本地分支已经存在而且已经分叉,Gitcito 会问你要怎么调和——变基、合并还是重置——并提议先把这个分支备份一份。

分叉分支的提示:变基、合并还是重置,并带一个备份选项

当本地分支落后时

检出时会直接快进(fast-forward)到远程最新提交。工作区若有改动,会先存入一个命名 的 stash,更新完成后再恢复,本地编辑不会中断这次更新。

当本地分支领先时

如果本地分支领先而远程没有新内容,直接检出等于用你尚未推送的工作回应一次对远程 分支的请求 —— 所以在你说明想要哪一边之前,什么都不会切换:

选择 结果
检出本地分支 切换到本地分支,提交原样保留。其他客户端默默做的就是这件事。
重置(soft) 把分支移回远程最新提交;这些提交的改动留在暂存区,可以重新提交。
重置(mixed) 同样的移动,改动留在工作区且未暂存。
重置(hard) 丢弃这些提交连同它们的改动。

领先分支的对话框:检出本地,或以 soft、mixed、hard 重置

保持勾选先创建备份分支,本地分支的最新提交会在任何移动之前保存为 backup/<分支>-<时间戳>,即使是 hard 重置也只差一次检出就能找回。重置同样会进入 撤销栈(⌘Z),但只在仓库关闭之前有效 —— 备份分支活得更久。

限制: 对话框只把分支和刚刚抓取到的跟踪引用作比较,因此拒绝抓取的远程(离线、 凭据错误)比较的是上一次已知的提交。它不会判断你的提交好不好,只说明它们在这里 存在、在那边没有。

远程

侧边栏的「远程」区用来添加、编辑、获取和删除远程。一个远程都没有的仓库上点获取、 拉取或推送,会打开同一个 添加远程 对话框 —— 粘贴 URL 或在托管上创建仓库 —— 而不是什么都不做。见获取、拉取与推送。

另请参阅: 合并与变基 · 工作树

在 GitHub 上改进这份翻译