是我的分支跟踪掌握?

时间:2012-03-25 06:00:22

标签: git branch

我这样做了:

git branch --track stats_page

创建一个单独的分支来尝试一些东西。但是现在我每次推或拉都会看到:

$ git pull
From .
 * branch            master     -> FETCH_HEAD

$ git push
Total 0 (delta 0), reused 0 (delta 0)
To .
   ff0caf5..e360168  stats_page -> master

我远离git master,所以我可能会错过了解正在发生的事情 - 但是我的stats_page分支跟踪掌握了吗?

我可能创建了错误的分支 - 如果是这样 - 我可以修复它,以便从现在开始推送并拉到远程stats_page分支吗?怎么样?

2 个答案:

答案 0 :(得分:3)

快速回答:解决此问题的最简单方法是Make an existing Git branch track a remote branch?

这里到底发生了什么

我总是发现git的“追踪分支”的描述让我自己感到困惑。至少对他们来说,他们听起来比他们做的要多得多。

我认为,技巧是要意识到git根本不会实际“跟踪”远程存储库。 (它从远程仓库中获取。)而是,“跟踪分支”跟踪您自己的仓库中的分支 。要“跟踪远程分支”,您需要创建一个分支,其名称表示它最初是从其他某个仓库复制的。 (在封面下,这意味着存储在refs/remotes/下的任何分支,或多或少。)最常见的“其他仓库”是名为origin的分支,它是初始git clone的分支。为你设定。正如它在git-clone手册页中所述:

  

此默认配置是通过在refs/remotes/origin下创建对远程分支头的引用并初始化remote.origin.urlremote.origin.fetch配置变量来实现的。

当您使用git branch --track创建分支时,它会使新分支“跟踪”您提供的“起点”。 (并且,“跟踪”主要是指“关联进行各种推/拉/获取操作,并在运行git status时告诉我更多信息。”因此,假设您克隆的回购已经有stats_page分支,您可能意味着来执行此操作:

git branch --track stats_page origin/stats_page

告诉git“创建一个名为stats_page的新分支,跟踪我在refs/remotes/origin/stats_page中的内容”(您通常会忽略refs/headsrefs/remotes部分,以及git数字他们出去)。你甚至不需要--track,因为右边的origin/部分会为你打开。

一旦你完成了所有这些,用git的术语,你有一个“本地”分支(refs/heads/stats_page)跟踪一个“远程”分支(refs/remotes/origin/stats_page)。要实际更新“远程”分支,请使用git fetch,或更明确地使用git fetch origin,它会转到与origin关联的网址并收集任何新内容,然后将其添加到您的回购。因此,尽管称之为“远程”,它仍然非常本地化:它就在你自己的本地磁盘上。

(我已经开始称git为“SCM的Borg”:“我们是git-Borg。我们将为您自己添加您的提交独特性。”您所做的大部分内容都会为您自己的回购添加新内容博格集体。)

使用git fetch更新“远程”分支(origin/stats_page)的本地副本后,您可以执行git merge将其合并到{stats_page 1}},没有origin/部分的名称)。并且,git pull只是在一个简单的步骤中运行这两个 - 这隐藏了实际从“远程”获取新内容的fetch这一事实

现在,您遇到的问题是:当您运行时:

git branch --track stats_page

您在master分支上,因此您创建了一个名为stats_page的新“本地”分支,用于跟踪您的master,而不是跟踪origin/stats_page。因此,git pullgit push只需拉动并推送名为master的本地分支。 (注意:如果您实际运行git fetch,仍然会进入remotes/origin/*,因此它仍会更新origin/stats_page,即使一个“本地”分支错误地跟踪另一个“本地”分支。 )

最后一点:通常当您创建一个跟踪同名远程分支的“本地”分支时,您还需要立即执行git checkout。您只需git checkout -b stats_page origin/stats_page即可完成所有三个步骤。 (如果你的git版本是旧的,它可能不会在你右边命名origin/stats_page时自动跟踪;但如果是这样你可能只是更新你的git版本。)

<小时/> 脚注:有些人建议完全不使用git pull,我有点同意。 git pull确实混合了两种截然不同的操作。特别是git pull remote_A remote_B似乎让人们在进行章鱼合并时会感到惊讶。使用git fetch似乎永远不会让人感到惊讶;一旦他们习惯并熟悉一个明确的git merge,快进合并背后的逻辑就会更有意义。但是,没有参数的git pull非常方便....

答案 1 :(得分:1)

在文本编辑器中打开.git / config,然后查找类似的内容:

 push = stats_page:master

您可能会在远程部分(而不是您的分支机构)中找到类似的内容。

您可以将其删除。默认情况下,推拉操作会推送/拉出所有匹配的名称。 push选项使得您可以将本地分支推送到具有不同名称的远程分支。

请查看分支的部分,您可能需要在那里调整“合并”选项。