2012-04-03 180 views

回答

157

这两个命令具有相同的效果(thanks to Robert Siemer’s answer for pointing it out)。

  • git checkout -b mybranch origin/abranch将创建mybranch和跟踪origin/abranch
  • git checkout --track origin/abranch只会造成“abranch”,而不是一个具有不同名称的分支:

    实际区别使用名为本地分支当不同来。

(也就是说,as commented通过Sebastian Graf,如果本地分支取得存在
如果那样,你需要git checkout -B abranch origin/abranch。)


首先,一些背景:跟踪表示本地分支的上游设置为远程分支:

# git config branch.<branch-name>.remote origin 
# git config branch.<branch-name>.merge refs/heads/branch 

git checkout -b branch origin/branch

  • 创建/重置branchorigin/branch参考点。
  • 创建分支branch(与git branch)并跟踪远程跟踪分支origin/branch

当本地分支开始了一个远程跟踪分支,GIT中设置的分支(特别是branch.<name>.remotebranch.<name>.merge配置条目)使得git pull将适当地从远程跟踪分支合并。
此行为可能会通过全局branch.autosetupmerge配置标志进行更改。该设置可以通过使用--track--no-track选项进行覆盖,并在稍后使用git分支--set-upstream-to进行更改。


而且git checkout --track origin/branch会做同样的:

# or, since 1.7.0 
git branch --set-upstream branch upstream/branch 
# or, since 1.8.0 (October 2012) 
git branch --set-upstream-to branch upstream/branch 
# the short version remains the same: 
git branch -u branch upstream/branch 

这也将设置为上游 'branch'。

(注:git1.8.0将弃用git branch --set-upstreamgit branch -u|--set-upstream-to替换:见git1.8.0-rc1 announce


具有本地分行将注册的上游分支:

  • 通知Git 显示git statusgit branch -v两个分支之间的关系。
  • 指示git pull无参数当检出新分支时从上游拉出

有关更多信息,请参阅“How do you make an existing git branch track a remote branch?”。

+0

@VonC我一直在寻找你偶然提及的那些细节,作为额外的信息。就我而言,我很好奇为什么我的一些分支允许我“拉扯”,而有些分支会要求一个远程分支从中拉出。事实证明,如果你第一次检查你的同行创建的远程分支,git会继续并添加分支。 .remote = origin'到本地gitconfig。然后允许你发出'git pull'。但是,如果您是创建分支'git checkout -b BNAME'的人,那么git -of course-不知道。所以你应该指定它的远程。 – batilc 2016-12-23 07:56:49

+0

@batilc“事实证明,如果你第一次检查你的同伴创建的远程分支,”;是的,阅读https://git-scm.com/docs/git-checkout,我看到:“'如果找不到',但确实存在跟踪分支在一个遥控器(称为”')与一个匹配的名称,视为等价于'$ git checkout -b --track /'“ – VonC 2016-12-23 08:00:21

+0

@VonC我找到了一个更好的配置。将'branch.autoSetupMerge'设置为'always'只需执行我们正在谈论的内容。此设置默认为“true”,这意味着只有在检出远程分支时才执行跟踪。 'true'不会为本地创建的分支设置跟踪。 – batilc 2016-12-26 06:39:06

5

The book似乎表明,这些命令产生相同的效果:

简单的情况就是你刚才看到的例子,运行git结帐-b [分支] [远程名]/[分支。如果你的Git版本1.6.2或更高版本 ,您还可以使用--track速记:

$ git checkout --track origin/serverfix 
Branch serverfix set up to track remote branch serverfix from origin. 
Switched to a new branch 'serverfix' 

要使用不同的名称建立一个本地分支比 远程分支,可以方便地使用第一版本不同的 本地分支名:

$ git checkout -b sf origin/serverfix 

当你的bash或OH-MY-zsh的git的落成是AB这是特别方便le拉origin/serverfix名称 - 只需追加--track(或-t),你就在路上。

18

完全没有区别!

1)git checkout -b branch origin/branch

如果没有--track和无--no-track--track假定为默认值。可以使用设置branch.autosetupmerge更改默认值。

实际上,1)表现得像git checkout -b branch --track origin/branch

2)git checkout --track origin/branch

“作为一个方便”,--track而不-b意味着-b和参数-b推测是“分支”。猜测由配置变量remote.origin.fetch驱动。

实际上,2)表现得像git checkout -b branch --track origin/branch

正如你所看到的:没有区别。

但它会变得更好:

3)git checkout branch

也相当于git checkout -b branch --track origin/branch如果“分支”还不存在,但“出身/分支”确实。


所有这三个命令都将“分支”的“上游”设置为“原点/分支”(或它们失败)。

上游被用作参考点的参数少git statusgit pushgit merge因此git pull(如果配置这样的(这是默认值或几乎默认))。

E.g. git status告诉你,如果配置了上游或下游,则上游有多远。

git push被配置为从git 2.0开始推动默认的当前分支上游。

...如果“原产地”是唯一的远程有“分支”
默认(命名为“简单”)强制执行两个分支名称相等

相关问题