为什么跟踪分支会创建一个新的远程分支?

时间:2013-11-15 14:25:24

标签: git version-control github

我有一个带远程分支origin / master的git存储库。

我需要存储库来跟踪另一个远程git服务器m1 / master上的分支。所以我使用git remote add命令添加了新的远程服务器。

所以我执行了以下命令:

$ git branch -a
* master
  remotes/m1/master
  remotes/origin/master

检查m1主分支

$ git checkout -b m1-master m1/master
Branch mht-m1 set up to track remote branch master from m1.
Switched to a new branch 'm1-master'

现在正在进行git push

$ git push
Total 0 (delta 0), reused 0 (delta 0)
To git@<m1 server>/repo.git
* [new branch]      m1-master -> m1-master 

为什么跟踪分支git push上的m1-master会创建一个新的远程分支,而不是将更改推送到它跟踪的现有远程分支?我在这里缺少什么?

PS:使用git版本1.8.4.2

2 个答案:

答案 0 :(得分:2)

由于push.default配置选项,Git服从。引用git-config(1) manual page

  

push.default

     

定义在命令行中没有给出refspec时应该采取的动作git push,   在远程中没有配置refspec,并且任何一个都没有暗示refspec   optionsgiven在命令行上。可能的值有:

     
      
  • 什么都没有 - 不要推动任何东西。

  •   
  • 匹配 - 推送两端具有相同名称的所有分支。这是为那些人   谁准备好所有的树枝成一个可发布的形状然后用一个推出它们   单一命令。它不适合推入​​由多个共享的存储库   用户,因为本地停滞的分支将尝试非快速推送,如果其他   用户更新了分支。

         

    目前这是默认设置,但Git 2.0会将默认设置更改为简单。

  •   
  • 上游 - 将当前分支推送到其上游分支。有了这个,git push将更新与git pull合并的同一个远程ref,使push和pull对称。有关如何配置上游

  • ,请参阅“branch。&lt; name&gt; .merge”   
  • 简单 - 就像上游一样,但如果上游分支的名称不同,则拒绝推送   来自当地的。

         

    这是最安全的选择,非常适合初学者。它将成为Git 2.0的默认设置。

  •   
  • current - 将当前分支推送到同名分支。

  •   
     

简单,当前和上游模式适用于那些想要推出单一模式的人   完成工作后的分支,即使其他分支尚未准备好被推动   出。如果您正在与其他人合作以推送到同一个共享存储库,那么您   我想要使​​用其中一种。

因此,出于某种原因,我将push.default设置为currentupstream,因此仅运行git push会将当前已检出的分支发送到默认远程试图更新一个具有相同名称的引用(可能创建它)。

您可以通过运行

来验证这是否属实
git config --get-all push.default

在您的存储库中。

答案 1 :(得分:2)

好的,首先,一些术语:

  • A(常规,普通,本地)分支类似于master

  • origin/master这样的“远程分支”是存储在本地存储库中的东西,用于记住远程遥控器上有自己的(本地)分支指向的位置

    当您联系遥控器时(通常在提取和推送时),“远程分支”会更新。那时,你的本地git会找出他们拥有的分支,并更新这些分支。

  • “跟踪分支”是一个记录两个项目的本地分支:“远程”,通常是origin之类的名称,另一个是“合并”名称。例如,如果您的本地分支master是跟踪分支,则可以使用branch.master.remote = originbranch.master.merge = master对其进行配置。令人讨厌的是,你不能总是把它们串在一起(你必须通过remote.origin.fetch映射才能完全正确)但一般来说这意味着你的本地master是“跟踪”{{1} }”。

你不能 1 在本地创建一个“远程分支”。您必须{/ 1}}或origin/master来自/来自遥控器。如果该远程具有名为fetch的本地分支,则您的git将使用push样式名称记录远程对该分支的想法。

那么,这里发生了什么?好吧,你这样做了:

X

创建一个名为origin/X的本地分支。 (这个本地分支也是一个跟踪分支,但由于下面的$ git checkout -b m1-master m1/master 设置,这只是部分相关的。)

然后,你这样做了:

m1-master

(在push.default之后没有远程名称且没有refspec)。 Git使用默认远程,由于跟踪,结果为$ git push 。接下来,git使用基于push和/或其他m1项的默认refspec。

从git 1.8.4.2开始,“默认push.default”为git config。这不会创建一个新的分支(但除非那里有push.default,否则也不会推送任何东西)。您将其设置为matching,这意味着:“请使用其当前名称在远程上更新或创建当前分支。”当前分支为m1-master,因此已创建。

current更改为m1-master以解决此问题:

push.default

(另请参阅"Warning: push.default is unset; its implicit value is changing in Git 2.0"了解其他各种选项。)


1 好吧,您可以在upstream目录中使用git config push.default upstream 或手动进行操作。 :-)只是,不是用“普通”用户命令。