Git跟踪分支机构

时间:2016-04-10 08:27:35

标签: git github version-control branching-and-merging remote-branch

我在本地创建了一个存储库,并将所有更改推送到github。 后来我创建了一个名为“v2”的新分支(“git branch v2”)并做了一些修改并将该分支推送到github。 后来当我执行命令“git remote show origin”时,我得到以下输出。

  * remote origin
  Fetch URL: https://github.com/mayuran19/se24_P03.git
  Push  URL: https://github.com/mayuran19/se24_P03.git
  HEAD branch: master
  Remote branches:
    master tracked
    v2     tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local refs configured for 'git push':
    master pushes to master (local out of date)
    v2     pushes to v2     (local out of date)

但是当我执行命令“git branch -vv”时,它显示分支“v2”不是跟踪分支。

  master bad4ed9 [origin/master] Correct name
  * v2     6ec46b0 Data files

我的问题是,为什么分支v2没有显示为跟踪分支,即使远程分支在github中可用并且我能够执行此分支的拉动和推送?

命令“git branch -a”的输出显示以下输出

  master
* v2
  remotes/origin/master
  remotes/origin/v2

但没有显示本地和远程分支之间的映射。

2 个答案:

答案 0 :(得分:4)

首先我们需要一些定义。

local 分支(也称为“分支”,没有修饰符)是全名以refs/heads/开头的分支。使用git branch时,默认情况下您会看到本地分支。 git branch命令会删除refs/heads/部分,为您留下masterv2等名称。

远程跟踪分支的全名以refs/remotes/开头(之后具有远程名称)。使用git branch -r时,该命令将显示远程跟踪分支。 git branch -r命令会删除refs/remotes/部分,为您留下origin/masterorigin/v2等名称。

前缀剥离有两种方式:git branch将其关闭,您也可以将其关闭。这是为了方便起见,只要您不小心提供以origin/开头的(常规,本地)分支名称,就可以正常工作。 (例如,如果你不小心命名了一个本地分支origin/abc,你可能会混淆自己,而git有助于剥离前缀变得有害。)

(请注意,所有这些实体都是您自己的存储库的本地实体,尽管名称为“远程跟踪”。还可能存在其他引用,您可以使用git for-each-ref查看所有这些实体,它将向您显示每个引用使用它的全名。大多数时候你不需要这个,git branch就足够了。)

可以将(常规,本地)分支设置为 track 另一个分支。让一个分支跟踪另一个分支为您做了一些事情,例如make git status告诉您何时领先和/或落后,并在git branch -vv输出中包括另一个分支。 (设置跟踪与远程跟踪分支不同。同样,本地分支的名称以refs/heads/开头,并且其名称不会更改是否设置为跟踪另一个分支。但是,术语肯定令人困惑。)

要使一个分支跟踪另一个分支,首先检查第一个分支(您要进行跟踪的分支)。然后,运行git branch --set-upstream-to otherbranch。例如,要v2跟踪origin/v2

git checkout v2
git branch --set-upstream-to origin/v2

要使本地分支跟踪另一个本地分支,只需使用本地分支名称而不是远程跟踪分支名称。要使本地分支停止跟踪任何内容,请使用git branch --unset-upstream

所有这一切还有一个技巧, 1 ,当你要求git checkout检出(但不创建)不存在的本地分支时,{{1将搜索是否存在具有类似名称的远程跟踪分支。如果是这样,它将创建本地分支将其设置为跟踪远程跟踪分支。也就是说,如果分支git checkout 不存在,例如,如果您重命名或删除现有的本地v2 - 而v2仍然 < / em>存在,然后:

origin/v2

创建本地分支git checkout v2 将其设置为一次跟踪v2

分支机构不需要跟踪另一个分支来推送和获取/合并/ rebase / pull,但是将其设置为跟踪可以使所有这些操作更方便。

1 与git一样,实际上有更多的方法可以使本地分支跟踪其他内容。您可以通过向推送添加origin/v2来设置本地分支,以便在成功git push上跟踪远程跟踪分支。您可以使用(不建议使用的)-u命令。您可以使用标记git branch --set-upstreamgit checkout来创建或重新创建具有跟踪集的分支。并且,您可以使用git branch(使用两个单独的git config命令)使本地分支跟踪其他分支。

答案 1 :(得分:3)

TL; DR v2不是跟踪分支 - 没有设置上游。 pull无法工作(您的想法)。 push由于默认推送规则而起作用。

  

我的问题是,为什么分支v2没有显示为跟踪分支

如果您查看.git / config,您会看到包含跟踪信息的branch "master"节,但您不会看到branch "v2"节,即{{1 isn&#39; ta跟踪分支。

  

即使远程分支在github中可用

推送非跟踪分支并不会自动成为跟踪分支。您需要在推送中添加v2才能执行此操作。您可能是在第一次推送非跟踪分支时执行此操作:

-u
  

我能够拉动和推动这个分支

由于$ git push -u origin v2 没有跟踪上游,

pull无法达到您的预期。它将更新本地仓库中的远程跟踪分支v2,但它不会在本地origin/v2分支中协调(合并或重新定位)本地提交与在远程设备上进行的任何新提交。但是,如果没有其他人对遥控器上的v2分支进行更新,那么您可能不会注意到问题。

v2的工作原理是默认的推送规则,它根据分支名称进行匹配。

push
  • Remote branches: master tracked v2 tracked Local branch configured for 'git pull': master merges with remote master Local refs configured for 'git push': master pushes to master (local out of date) v2 pushes to v2 (local out of date) 部分显示您本地仓库中的远程跟踪分支Remote branches:跟踪远程分支origin/v2。 (远程跟踪分支v2与您的本地origin/v2分支不同。)
  • v2部分仅显示本地分支Local branch configured ...master影响,即pull跟踪远程mastermaster未列出 - v2不会影响它,因为它没有上游设置。
  • pull部分显示您的Local refs configured ...分支将推送/更新到远程v2(并更新v2) - 这是基于推送命令& #39;默认匹配规则(也取决于您origin/v2配置的设置方式以及您使用的push.default版本。

请注意gitpush之间存在一点不一致或违反直觉的行为。传统上,pull没有完全指定的refspec arg,默认情况下,并不关心上游 - 它只是在远程上推送同名的分支。由于跟踪的远程分支通常与本地分支命名相同,因此事情起作用,pushpush命令似乎都使用配置的跟踪分支。但是,如果本地分支和远程分支的命名方式不同,pull可能无法按预期工作。对pushgit的{​​{1}}的各种版本的某些更改,即pushpush.defaulttracking,会尝试协调这些更改差异。

补充阅读: