269

有人知道这两个用于切换和跟踪远程分支的命令之间的区别吗?

git checkout -b branch origin/branch
git checkout --track origin/branch

我认为两者都跟踪远程分支,以便我可以将更改推送到原始分支,对吗?

有什么实际区别吗?

4

4 回答 4

355

这两个命令具有相同的效果(感谢 Robert Siemer 指出的答案)。

当使用不同名称的本地分支时,实际差异就出现

  • git checkout -b mybranch origin/abranch将创建mybranch和跟踪origin/abranch
  • git checkout --track origin/abranch只会创建' abranch',而不是具有不同名称的分支。

(也就是说,正如Sebastian Graf所评论的,如果本地分支存在。
如果存在,则需要git checkout -B abranch origin/abranch


注意:使用 Git 2.23(2019 年第三季度),将使用新命令git switch

git switch -c <branch> --track <remote>/<branch>

如果分支存在于多个遥控器中并且其中一个由checkout.defaultRemote配置变量命名,我们将使用该分支来消除歧义,即使它<branch>在所有遥控器中不是唯一的。
将其设置为例如,如果不明确但存在于“原点”远程上,checkout.defaultRemote=origin则始终从那里签出远程分支。<branch>

这里,' -c' 是新的 ' -b'。


首先,一些背景:跟踪意味着本地分支将其上游设置为远程分支:

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

git checkout -b branch origin/branch将要:

  • 创建/重置branch到引用的点origin/branch
  • 创建分支branch(使用git branch)并跟踪远程跟踪分支origin/branch

当本地分支从远程跟踪分支启动时,Git 会设置分支(特别是branch.<name>.remotebranch.<name>.merge配置条目),以便git pull从远程跟踪分支适当地合并。
可以通过全局branch.autosetupmerge配置标志更改此行为。可以使用--trackand--no-track选项覆盖该设置,稍后使用 git branch 进行更改--set-upstream-to


并且git checkout --track origin/branch会做同样的事情git branch --set-upstream-to):

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

它还将为“ branch”设置上游。

(注意: git1.8.0 将弃用git branch --set-upstream并将其替换为git branch -u|--set-upstream-to:参见git1.8.0-rc1announce


为本地分支注册上游分支将:

  • 告诉 git显示中的两个分支之间的关系git statusgit branch -v
  • 签出新分支时,git pull 不带参数指示从上游拉取。

有关更多信息,请参阅“如何使现有的 git 分支跟踪远程分支? ”。

于 2012-04-03T22:39:05.570 回答
43

完全没有区别!

1)git checkout -b branch origin/branch

如果有 no--track和 no --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/branchif “branch” 尚不存在但 “origin/branch” 存在1


所有三个命令都将“branch”的“upstream”设置为“origin/branch”(否则它们会失败)。

Upstream 用作无参数 , 的参考点git statusgit push因此git mergegit pull如果这样配置(这是默认值或几乎默认值))。

例如git status,如果配置了上游,则告诉您落后或领先上游多远。

git push配置为从 git 2.0 开始默认将当前分支推送到上游2 。

1 ...如果“origin”是唯一具有“branch”的遥控器</sup>
2默认(命名为“simple”)强制两个分支名称相等

于 2015-04-21T22:23:12.673 回答
5

这本书似乎表明这些命令产生相同的效果:

简单的例子就是你刚才看到的例子,运行 git checkout -b [branch] [remotename]/[branch]。如果您有 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 完成能够origin/serverfix为您提取名称时,这特别方便 - 只需附加--track(或-t) 即可。

于 2014-03-26T16:51:43.317 回答
0

您无法使用此命令创建新分支

git checkout --track origin/branch

如果您有未暂存的更改。

这是示例:

$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   src/App.js

no changes added to commit (use "git add" and/or "git commit -a")

// TRY TO CREATE:

$ git checkout --track origin/new-branch
fatal: 'origin/new-branch' is not a commit and a branch 'new-branch' cannot be created from it

但是,您可以使用以下命令轻松创建具有未暂存更改的新分支git checkout -b

$ git checkout -b new-branch
Switched to a new branch 'new-branch'
M       src/App.js
于 2019-04-11T09:46:32.757 回答