同步与多仓库

获取、拉取与推送

拉取

三种模式,从下拉菜单里选:默认、仅快进或变基。本地改动会在拉取前后自动贮藏再恢复,所以工作区脏着也不会把你挡住。

没有跟踪任何分支的分支

git pull 是先获取再合并,而合并需要知道 往哪里 合 —— 也就是分支的上游。本地新建的 分支,或者检出时没有建立跟踪的分支,都没有上游。获取照样成功,一长串更新过的 origin/* 引用滚过去,然后 git 停在 "There is no tracking information for the current branch"。什么都没有拉下来,也什么都没坏:后半段只是没有目标。

Gitcito 读取这个错误,把修复做成一个按钮,并根据远程是否已经有这个分支来决定给哪一个:

远程上已有 关联并拉取 —— 把上游设为 <远程>/<分支>,然后执行你请求的拉取。可用 ⌘Z 撤销,撤销会再次解除跟踪。
远程上还没有 推送分支 —— 一次普通推送,顺带把上游设好。

提供的远程有 origin 时就用它,否则用列表里的第一个。属于哪种情况是从远程跟踪引用里 读的,不走网络,所以答案反映的正是刚刚跑完的那次获取。

推送

强制推送一律使用 --force-with-lease——那个安全的变体,只要远程在你上次查看之后动过就拒绝执行。对受保护分支做强制推送会要求确认(名单在仓库设置的齿轮里)。

受保护分支在强制推送前要求的确认

没有远程

推送、拉取和获取都需要一个去处。一个远程都没有的仓库 —— 刚 git init 的,或者 origin 被删掉的克隆 —— 以前会让这些按钮什么都不做,或者把空获取当成成功。现在 它们打开 添加远程,带一句警告,让你粘贴 URL 或在托管上创建仓库。添加完会 把你开始的动作做完:推送会发布当前分支,拉取会先获取再拉取,获取只获取。

后台自动获取在没有可获取的内容时保持安静。它不会按计时器弹出对话框。

不止一个远程

推送按钮指向分支的上游。一旦仓库有了不止一个远程,旁边的箭头还会提供:

推送到某一个远程 挑一个远程——一个复刻、一个镜像、一个部署目标
推送到全部 N 个远程 每个远程一次推送,按顺序来
把所有标签推送到 git push <remote> --tags,本地全部标签一次送出去

同样这两个动作也在侧边栏里每个远程自己那一行上,而问题冒出来的时候,你通常正好就在那儿。

一个被拒绝,不会取消其余的。 同时推送一个复刻和它的上游,恰恰就是一边拒绝、另一边仍然该走通的场景,所以每个远程各报各的:成功的在一条提示里点名,每个失败的单独一条,附上 git 给的理由。

只有列表里的第一个远程会设置分支的上游。一个分支只有一个上游,而最后被推送的那个远程未必就是你想让它跟踪的那个。

两条路径都会走和普通推送一样的检查——受保护分支的确认,以及密钥守卫。往两个远程发布是双倍的暴露,不是一半的谨慎。

你没有检出的分支

git pull 只会移动 HEAD,这就是多数客户端要求你先检出分支才能让它跟上的原因。 Gitcito 不需要:在侧边栏或提交图的分支徽章上右键点击任意本地分支, 就有拉取 <分支>和推送 <分支>,两者都作用于该分支,而不是当前检出的 那一个。

拉取 <分支> 把本地引用快进到它的上游,无需检出。工作区不受影响。可用 ⌘Z 撤销 —— 撤销会把分支放回原处。
推送 <分支> 该分支的普通推送,带有与工具栏按钮相同的受保护分支确认和机密守卫。

对不跟踪任何上游的分支,拉取是灰的 —— 无处可拉。在你当前所在的分支上,两者都 回落到普通拉取,它也会更新工作区。

值得知道的限制:与上游分叉的分支会被拒绝,并给出说明。化解分叉是一次合并或 变基,两者都需要工作区 —— 所以那种情况仍然要花一次检出。远程拒绝推送时,非当前分支 仍会提供强制推送;而"先拉取再重试"的路径不会,原因相同。

获取

获取 在工具栏上有自己的按钮,就在拉取旁边。它会获取所有远程并清理,让你的 origin/* 引用和所有领先/落后计数都保持最新 —— 同时既不动你的分支,也不动你的工作区。 想在不挪动自己工作的前提下 看看 别人做了什么时,按的就是它。

此外还有按你设定的间隔在后台运行的 自动获取(设置 → 常规)。把鼠标停在获取按钮上, 距离上次获取的时间就会在下方淡入 —— 4 分钟前 —— 超过十五分钟时呈琥珀色。它从不占用 工具栏的位置,因为这是只有在伸手去按按钮时才会冒出来的问题。它读自 FETCH_HEAD, 所以在终端里跑的 git fetch 和在这里跑的算同一回事。

一次获取如果发现历史被重写,它会说出来:一条提示点名那个分支,那一行会多出一个标记,点开就是自那以后改了什么,起点正是它原先指向的那个提交。

一次面对多个仓库

  • 一个分组标签页可以对它整棵子树获取全部 / 拉取全部。
  • 任务中心在整个工作空间里做同样的事,而且可以只拉取那些确实落后的仓库。

远程

在侧边栏里添加、编辑、删除远程,也可以单独获取某一个。分支行带有按远程划分的存在徽标,所以一眼就能看出哪些远程有这个分支的副本。

没有远程时获取、拉取或推送会打开同一个「添加远程」对话框,而不是空跑成功。见获取、拉取与推送。

另请参阅: 任务中心 · 托管与拉取请求

在 GitHub 上改进这份翻译