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

Git 哪种方法更适合跟踪远程分支?,git,Git,我有一个名为“master”的非跟踪分支 我在Github上有一个名为“master”的远程分支 建议创建用于跟踪远程分支的跟踪分支,因为它允许您更轻松地执行推送/获取,因为这样可以避免您在下一次推送/获取时显式指定“远程回购名称”和“要推送的本地分支” 因此,有两种方法可以做到这一点: 第一路 “主”分支->源/主”->“远程主分支” 这是使用“git push-u”完成的 第二条道路 “主”分支可以直接跟踪“远程主分支” 一种方式比另一种好,或者这只是风格的问题?从功能上讲,它们都会产生

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

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

建议创建用于跟踪远程分支的跟踪分支,因为它允许您更轻松地执行推送/获取,因为这样可以避免您在下一次推送/获取时显式指定“远程回购名称”和“要推送的本地分支”

因此,有两种方法可以做到这一点:

第一路

“主”分支->源/主”->“远程主分支”

这是使用“git push-u”完成的

第二条道路

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


一种方式比另一种好,或者这只是风格的问题?

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

$ 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-push
加上
git-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
1st在master和origin/master之前,应该推送更改,但它没有。我花了一段时间才意识到,
git push-u origin master
推送的是master而不是1st。哇,它没有推送当前分支!这是因为
master
部分指的是远程目标分支,而git猜到了本地源分支也是主分支,而不是我的当前分支。此行为将根据您拥有的Git版本和配置方式而改变

这就是为什么我做了更明确的
git-push-u远程本地\源\分支:远程\目标\分支
语法。
git-push-u源第一:主

一般来说,如果您直接从远程分支,Git的最新版本应该为您解决这个问题。这由默认值为
true
的控件控制

$ git co -b 3rd origin/master
Branch 3rd set up to track remote branch master from origin.
Switched to a new branch '3rd'
这是建立远程跟踪分支机构最安全的方法


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

嗨。如果我将非跟踪分支变为跟踪分支,这是否意味着新的“源/主”分支“分支已创建,此分支是否执行跟踪?我认为有两种方法可以做到这一点。根据您的输入,只有第1种方式存在。第二条路根本不存在。对吗?@Qwerty与其将非跟踪分支变成跟踪分支,不如将其视为告诉一个分支跟踪另一个分支。如果要跟踪的分支不存在,则无法跟踪它。Git将解释如果您运行
Git分支-u origin/不存在
。您必须首先创建远程分支
git push remote src:dest
将生成远程分支。如果添加
-u
,它也会添加跟踪。您可以将
git push-u
想象为
git push
(将更改发送到远程)加上
git branch-u
(添加跟踪)。谢谢。然而,我仍然不明白一件事。如果我对本地主分支使用“git branch-u”,这会导致创建新的“origin/master”分支吗?谁在跟踪:本地主分支或创建的“源/主”分支?实际上
master
指的是
push
上的本地分支(它是
git push
的refspec部分)。对于fetch,refspec被解析为
,如果省略本地部分,它将默认为空,但是对于push,它被解析为
,如果省略远程部分,它将默认为。。。嗯,推送文档中模糊地描述了一个过于复杂的算法,祝福git的gitty little heart.:-)@Qwerty:(回复最新评论)这就是git的命名留下了一些有待改进的地方。如Schwern所示,如果一个(本地)分支在配置中同时有一个
remote
和一个
merge
,那么它就被称为“跟踪”某物。同时,名为
refs/remotes/origin/*
的分支称为“远程跟踪分支”。所以“跟踪”和“分支”都被重载了!另外,
git branch-u
git branch——将上游设置为
不会创建任何名称,它只会更新现有(本地)分支的
远程
合并
值。