Git: 不签出跟踪分支?

Git: Track branch without checking out?

所以,我知道你可以通过以下方式拉出一个分支而不用检查它:

git fetch origin branchname:branchname

有没有办法在不签出的情况下也跟踪该分支? (通常,这是通过:git checkout --track origin/branchnamegit branch -u origin branchname 完成的)答案可以完全是一个单独的命令,也可以是上述提取的一部分。

答案已经包含在您的问题中,正如一些评论者指出的那样:使用 git branch --set-upstream-to=origin/<em>branchname branchname</em>(或带有 -u 的较短版本)。不过,在这里添加一些注释可能很重要。

那不是 拉分支 (或者,好吧,也许是,因为该短语没有明确定义:-))。 git fetch origin <em>branchname</em>:<em>branchname</em> 的作用是:

  • 从源获取任何需要的提交,然后
  • 根据 fetch 在 origin 的分支 [=12 中看到的内容,创建或更新名为 branchname 的本地分支=].

如果对branchname的更改不是快进操作,则更新(如果是更新)将失败。要在这种情况下强制它成功,请添加强制标志:--force 或前导加号 +.

如果 branchname 是当前签出的分支,即如果 HEAD 是对该分支的符号引用。也就是说,你只能 git fetch origin <em>branchname</em>:<em>branchname</em> if that branch name现在实际上还没有签出。

同时,git branch --set-upstream-to 设置(或覆盖)(本地)分支的 upstream 设置。每个本地分支可以有一个 upstream 设置(或没有上游设置)。拥有上游使得 other Git 命令——而不是 git fetch——更易于使用。或者至少,这就是它的 目的; 您个人是否认为结果“更容易”是个人喜好的问题。 (不过,我从来没有遇到过 更难 的人。)

如果本地分支已经存在并且已经有上游设置,您可能不想覆盖当前的上游设置。您可以使用 git rev-parse 检查: <em>branchname</em>@{upstream} names 当前上游设置 branchname,如果没有则失败,所以:

if ! git rev-parse $branchname@{upstream} >/dev/null 2>&1; then
    git branch --set-upstream-to=origin/$branchname $branchname
fi

如果未设置,将设置上游,但如果已设置,则不执行任何操作。