Answers:
这两个命令具有相同的效果(感谢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>.remote
和branch.<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 status
和中两个分支之间的关系git branch -v
。git pull
不带参数从新分支检出时从上游拉出。有关更多信息,请参见“ 如何使现有的git分支跟踪远程分支? ”。
If <branch>
未找到,但确实在一个<remote>
具有匹配名称的远程(称为)中存在一个跟踪分支,等同于$ git checkout -b <branch> --track <remote>/<branch>
”
branch.autoSetupMerge
为always
仅执行我们正在谈论的内容。此设置默认为true
,这意味着仅当签出远程分支时才执行跟踪。true
没有为本地创建的分支设置跟踪。
完全没有区别!
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 status
,git push
,git merge
并因此git pull
(如果配置这样的(这是默认值或几乎默认))。
例如git status
,如果已配置,则告诉您上游的距离是多远。
git push
从git 2.0开始,默认情况下配置为将当前分支推送到上游2。
1 ...并且如果“起源”是唯一具有“分支” 2的远程服务器,则默认值(名为“简单”)也会强制两个分支名称相等
这本书似乎表明这些命令产生了相同的效果:
最简单的例子是您刚刚看到的示例,运行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
)就可以了。
您不能使用此命令创建新分支
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
)
origin/new-branch
而不是origin/branch
。你知道吗?
git pull
,而有些分支却要求从中取出一个远程分支。事实证明,如果您是第一次检查由对等方创建的远程分支,则git会继续并将其添加branch.<BNAME>.remote=origin
到本地gitconfig中。然后允许您发出git pull
。但是,如果您是创建分支的人git checkout -b BNAME
,那么git-当然-是不知道的。因此,您应该指定其遥控器。