git checkout --track原点/分支和git checkout -b分支原点/分支之间的区别


208

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

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

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

有实际差异吗?

谢谢!

Answers:


281

这两个命令具有相同的效果(感谢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配置标志来更改此行为。可以使用--track--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 status和中两个分支之间的关系git branch -v
  • 指示git pull 不带参数从新分支检出时从上游拉出

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


1
@VonC我一直在寻找您碰巧提到的一些小细节,作为额外的信息。就我而言,我很好奇为什么有些分支允许我使用git pull,而有些分支却要求从中取出一个远程分支。事实证明,如果您是第一次检查由对等方创建的远程分支,则git会继续并将其添加branch.<BNAME>.remote=origin到本地gitconfig中。然后允许您发出git pull。但是,如果您是创建分支的人git checkout -b BNAME,那么git-当然-是不知道的。因此,您应该指定其遥控器。
batilc

@batilc“事实证明,如果您是第一次签出同级创建的远程分支,”;是的,阅读git-scm.com/docs/git-checkout,我看到:“ If <branch>未找到,但确实在一个<remote>具有匹配名称的远程(称为)中存在一个跟踪分支,等同于$ git checkout -b <branch> --track <remote>/<branch>
VonC

@VonC我为此找到了更好的配置。设置branch.autoSetupMergealways仅执行我们正在谈论的内容。此设置默认为true,这意味着仅当签出远程分支时才执行跟踪。true没有为本地创建的分支设置跟踪。
batilc

@batilc我同意。我倾向于不总是使用,因为我更喜欢显式设置跟踪,但是在您的情况下,这应该是正确的设置。
VonC

1
“ git branch --set-upstream-to分支上游/分支”不是正确的语法。它应该是:“ git分支--set-upstream-to上游/分支分支”
maharvey67 '18

33

完全没有区别!

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并且to的论点-b被认为是“分支”。猜测是由配置变量驱动的remote.origin.fetch

实际上,2)的行为类似于git checkout -b branch --track origin/branch

如您所见:没有区别。

但它变得更好:

3) git checkout branch

也等于git checkout -b branch --track origin/branch如果“分支”尚不存在,但“起源/分支”存在1


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

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

例如git status,如果已配置,则告诉您上游的距离是多远。

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

1 ...并且如果“起源”是唯一具有“分支” 2远程服务器,则默认值(名为“简单”)也会强制两个分支名称相等


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)就可以了。


-1

您不能使用此命令创建新分支

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

请记住,问题中的两个命令都是用于跟踪现有的远程分支(origin/branch
yorch '19

@Green测试所用的是origin/new-branch而不是origin/branch。你知道吗?
罗伯·西默
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.