什么是跟踪参考?


73

当我通过Git Extensions将新分支推送到远程存储库时,我收到一条警报,说

The branch {branch name} does not have a tracking reference. Do
you want to add a tracking reference for {branch name}?

什么是跟踪参考?我在Google中只发现了很少的跟踪引用,也没有真正的定义。


2
有关详细信息,请参见push -u。
bmargulies

如果我正确理解了有关push,pull和config的git手册页,则跟踪参考是添加到配置文件中的一个或多个设置,由无参数git-pull用来告诉它要下拉的内容。我发现文档有些混乱,但我认为跟踪参考是配置文件中以下设置的组合:remote。<name> .fetch和branch。<name> .merge。那是对的吗?
西蒙·图西

1
跟踪参考是本地分支(例如)和远程分支(例如)之间链接masterorigin/master
dedek

Answers:


37

基本思想是,存在纯本地引用(例如,分支,标签),然后存在远程跟踪引用,这些跟踪引用遵循其他存储库中发生的情况。由于Git是分散式的,因此您可以为分支选择一个名称,该名称与远程使用的分支相同,而无需了解另一个,从而使它们的工作完全不同。Git允许您执行此操作,但是它还提供了一种将本地引用链接到远程引用的方法。

例如,考虑以下内容:

% git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/maint
  remotes/origin/master
  remotes/origin/next
  remotes/origin/pu
  remotes/origin/todo

下面我们就对分支机构originnexttodo

% git checkout -t remotes/origin/next
Branch next set up to track remote branch next from origin.
Switched to a new branch 'next'
% git branch todo    

现在,我们有了一个本地分支next,该分支跟踪同名的远程分支和一个本地分支,该分支todo不会随着对的更改而更新remotes/origin/todo


谢谢。因此,“引用”只是一个对象,例如分支或标签,而“跟踪引用”只是一个链接到远程存储库中相应对象的对象?
西蒙·图西

2
是的-这是主要思想。“对象”在Git中具有特殊含义;它表示任何具有SHA1且存储在.git / objects下的东西,因此它比“引用”更通用,但这就是这个想法。
埃里克·沃克

21
嗯,呃,有人想要建议我们说是还是否?“您要向母版添加跟踪参考吗?” 实际上,这一切仍然令人困惑。常用的是什么?两种选择都有优点和缺点吗?有人可以说“是”而忘了它而不会引起任何问题吗?
Nicholas Petersen 2013年

5
@NicholasPetersen,在大多数情况下,您要避免使用相同的名称作为遥控器上用于其他工作的参考。这意味着您通常希望使用跟踪参考或选择其他名称。
埃里克·沃克

1
有人告诉我“分支母版没有跟踪参考。是否要向母版添加跟踪参考?” 场景:我在GitHub中克隆了一个存储库,对本地副本进行了更改,已提交。然后我想发送一个拉取请求,所以我在GitHub上分叉了相同的仓库。接下来,我删除了原始的“起源”,并用新叉子的“起源”代替了它。最后,我尝试在Git扩展中使用新的“源”。这是继“您将要推送的分支似乎是远程的新分支”之后的第二个警告。我很担心!所以问题仍然存在...是或否?
Qwertie

13

本地git分支可以跟踪一个远程分支,这意味着git push和git pull命令将知道默认情况下将跟踪和跟踪中的提交推入和拉出。git status还将告诉您当前正在跟踪的本地分支和远程分支之间的状态。克隆git存储库时,git将向本地master分支添加跟踪引用以跟踪远程master分支。当您从新的远程分支签出时,git会向创建的本地分支添加跟踪引用,以跟踪您签出的远程分支。

但是,如果在本地创建一个新分支,然后将其推送到远程存储库,则必须明确告诉git如果您希望本地分支开始跟踪新的远程分支。在将本地分支推送到远程存储库时,可以使用-u--set-upstream选项进行操作git push -u origin my-new-branch

您可以使用以下命令检查本地分支正在跟踪哪些远程分支(如果有),git branch -vv这是输出的一个小示例。

  b1     560eb64 Added file.txt
  b2     560eb64 [origin/b2] Added file.txt
  b3     b638c18 [origin/r1: ahead 1] Added file3.txt
* master 560eb64 [origin/master] Added file.txt

在这种情况下,我们有地方分支机构masterb1b2b3。该master分支正在跟踪一个称为的远程分支master,该b1分支未在跟踪任何远程分支,该b2分支正在跟踪一个远程分支,b2而该b3分支在跟踪一个远程分支r1git branch -vv还显示与所跟踪分支相关的分支状态。在这里,分支b3是在跟踪的远程分支之前的1个提交,其他分支与它们各自的远程跟踪的分支是最新的。

因此,如果您创建本地分支并推送到远程存储库,是否要向分支添加跟踪引用?通常,当您将一个新的本地分支推送到远程存储库时,便可以与其他开发人员就某个功能进行协作。如果将跟踪引用添加到本地分支,则可以方便地拉取其他人对该分支所做的更改,因此我想在大多数情况下,您想添加跟踪引用。


6

尼克·夸兰托(Nick Quaranto)出色的博客git ready有一篇帖子解释了远程跟踪分支

远程跟踪分支有几个不同的用途:

  • 与远程上的内容相比,它们用于链接您在本地上的内容。

  • 当您使用git pull或git fetch时,他们会自动知道从哪个远程分支获取更改。

  • 更好的是,git status将识别出他在分支的远程版本之前有多少个提交。


5

是的,您可能想要添加它。在控制台中执行此操作:git branch --set-upstream-to origin / master

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.