哪种方式更适合跟踪远程分支?

时间:2015-05-16 17:53:10

标签: git

我有一个名为“master”的非跟踪分支。

我在Github上有一个名为“master”的远程分支。

建议创建跟踪分支以跟踪远程分支,因为它允许您更轻松地执行推送/提取,因为它可以避免显式指定“远程仓库名称”和“本地分支到推送” “在你的下一次推/取。

所以有两种方法可以做到:

第一路

“master”分支 - > origin / master“ - >”远程主分支“

这是使用“git push -u”

完成的

Why do I need to explicitly push a new branch?

第二路

“master”分支可以直接跟踪“远程主分支”

Make an existing Git branch track a remote branch?

一种方式比另一种方式更好,还是风格问题?

1 个答案:

答案 0 :(得分:2)

从功能上讲,它们都会产生同样的结果。当我尝试这两种样式时,它们会产生相同的配置。

$ git push -u origin 1st:master
Counting objects: 3, done.
Writing objects: 100% (3/3), 261 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /Users/schwern/tmp/test-repo
   71f7d8f..6729320  1st -> master
Branch 1st set up to track remote branch master from origin.

$ git branch -u origin/master
Branch 2nd set up to track remote branch master from origin.

$ cat .git/config
...
[remote "origin"]
    url = /Users/schwern/tmp/test-repo
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[branch "2nd"]
    remote = origin
    merge = refs/heads/master
[branch "1st"]
    remote = origin
    merge = refs/heads/master

远程分支没有“直接”跟踪。 Git远程分支是您的存储库中的常规分支,恰好是从远程存储库更新的。 “跟踪”告诉一个分支从另一个分支推送和拉动。

git push将更改发送到远程。 git branch -u告诉分支机构要跟踪的内容。 git push -u基本上是git pushgit branch -u

从界面的角度来看,git branch -u remote/branch更安全一些。它更明确,更不神奇。例如,当我设置这个例子时,我尝试了这个......

$ git branch
* 1st
  2nd
  master
$ git push -u origin master
Branch master set up to track remote branch master from origin.
Everything up-to-date

第一名领先于大师和原创/大师,应该推动改变,但事实并非如此。我花了一段时间才意识到git push -u origin master正在推动而不是第一。哇,它没有推动当前的分支!这是因为master部分引用了远程目标分支,Git猜测本地源分支也是主分支,不是我当前的分支。此行为将根据您拥有的Git版本以及如何配置而发生变化。

这就是为什么我做了更明确的git push -u remote local_source_branch:remote_destination_branch语法。 git push -u origin 1st:master

一般情况下,如果您直接从远程分支,Git的最新版本应该为您解决此问题。这由branch.autosetupmerge控制,默认为true

$ git co -b 3rd origin/master
Branch 3rd set up to track remote branch master from origin.
Switched to a new branch '3rd'

IMO是设置远程跟踪分支的最安全方式。

PS你可以在不需要新服务器的情况下玩遥控器。远程不必是URL,它可以是目录。它只需要是一个裸存储库(即没有检出文件)。 git init --bare /path/to/somedir然后git clone /path/to/somedir