Git远程分支跟踪 - 我做得对吗?

时间:2017-02-13 14:03:21

标签: git

我刚读过这个问题/答案:

what-exactly-does-the-u-do-git-push-u-origin-master-vs-git-push-origin-ma

然而,我仍然有点不清楚:

  1. 如果我忘记执行git push -u origin myBranch,而只是执行git push origin myBranch,我可以通过执行git push -u origin myBranch来纠正它吗?
  2. 它似乎有效,因为当我执行git branch -vv时,我可以看到原点/主人和myBranch都被跟踪。

    但这是对的吗? - 如果他们都被追踪或者我做错了吗?

    1. git push -u <remote> HEAD真的等同于git push -u origin myBranch吗?

    2. 最后,我想举一个例子来说明我的工作,以确保我的工作方式没有问题。

    3. 这是我的小事......

      # Recursive clone to to get the submodules
      git clone <URL> -b topLevel --recursive
      # Create my branch
      git branch myBranch
      # Now switch to my branch
      git checkout myBranch
      # Now add my branch to the remote
      git push origin myBranch
      # ...make some local changes...
      git commit -am "did some changes"
      # Oops I forgot to do the tracking... but I want to push my changes up...
      git push -u origin myBranch
      # Finally go into development loop:
      
      # ... Do some changes...
      git commit -am "did some changes"
      git push
      # repeat
      

2 个答案:

答案 0 :(得分:1)

  1. 没有什么可以纠正的。你没有做错任何事。添加-u只会添加上游跟踪引用,以便将来可以使用无参数git pull而无需指定远程和分支。如果您忘记了-u,请稍后再使用它。 (如果您愿意,也可以手动设置跟踪。)

  2. 如果你的遥控器和origin是相同的(如果你从有问题的遥控器克隆了你的回购可能),如果HEADmyBranch是同样的事情(如果你现在正在研究myBranch,那很可能),那么是的,那些是等价的。

  3. 您的示例方案中没有问题。

答案 1 :(得分:1)

为了完全清晰(如果可以使用Git :-)),这里有几个大部分独立的部分。

每个(本地)分支都可以有一个上游。上游设置有几个较旧的名称,但让我们坚持“上游”,因为它是最佳名称。 :-)这个上游决定了无参数git pushgit merge以及git rebase。 (我建议在这一点上完全避免git pull - 所有这一切都运行git fetch,然后运行git mergegit rebase,最好手动控制是否进行合并或者一个rebase,直到你真的熟悉Git,以便你能够识别它在出现问题时所做的事情,因为它们总是最终做到。通常rebase更好,pull默认合并。你可以重新配置pull的默认值,但除非你像Git人一样迷恋点击计数,否则我说:不要打扰。)

设置上游的方法有很多种。 (顺便说一下,只有一个上游 - 或者,如果你 un - 设置它,没有上游。但是,这里的要点是,从来没有两个或更多上游。)一旦设置,它为您提供了一堆便利。除了无参数命令外,git status还会告诉您更多内容。

设置它的最直接方法是git branch --set-upstream-to 1 您可以设置当前分支的上游:

git branch --set-upstream-to origin/zorg

或设置一些其他分支的上游:

git branch --set-upstream-to origin/zorg my-other-branch

(我在这个例子中使用不同的本地和远程跟踪分支名称,这通常有点不明智,但话又说回来,你为什么要把你的上游设置为邪恶?:-))。

问题是,--set-upstream-to的参数 - 远程跟踪分支名称 - 必须是所在的实际现有远程跟踪分支的名称现在在您自己的资源库中。 (请记住,远程跟踪分支名称是您的存储库中的名称。它被称为“远程跟踪”,因为您的Git会自动将其更新为Git在上看到的 Git,当你从遥控器git fetch时。)

创建分支时,在远程上不存在< - >您自己的Git也没有远程跟踪分支。怎么可能呢?您的远程跟踪分支来自遥控器,他们还没有!所以这意味着你不能使用git branch --set-upstream-to,至少现在还没有。

一旦你 git push这个新的分支,你的遥控器将拥有分支,你的Git将添加相应的远程跟踪分支。然后,您就可以使用git branch --set-upstream-to了。但是,quelle horreur,需要输入两个命令!因此,git push增加了--set-upstream又名-u选项,以便您可以告诉您Git:“做这个推动,然后做--set-upstream-to的事情。”因为我们都知道,当我们输入git fetchentergit rebase时,使用两个命令(例如git pull --rebase)太难以输入了。为什么,这可以节省三个完整的按键!

(稍微更严重的是,-u的{​​{1}}选项也会解决可能发生的投诉,具体取决于您git push的配置方式。所以它不仅可以减少击键次数,还可以有时可以减少混淆。)

除非您因某种原因需要更改上游设置,否则只需设置一次。您可以在第一次推送push.default之后,或第一次推送git branch期间,或第一次推送后{@ 1}}再次推送时随时执行此操作。这只是重新设置它。

1 还有-u。有人可能会认为,鉴于Git程序员对较少的击键次数的痴迷,这将是使用的命令。但是它有一个错误的参数顺序:它首先被放入-u得到了这个更短的名字。然后他们发现人们不断得到错误的参数,所以他们添加了更长的命令选项。