有人知道这两个用于切换和跟踪远程分支的命令之间的区别吗?
git checkout -b branch origin/branch
git checkout --track origin/branch
我认为两者都跟踪远程分支,以便我可以将更改推送到原始分支,对吗?
有什么实际区别吗?
有人知道这两个用于切换和跟踪远程分支的命令之间的区别吗?
git checkout -b branch origin/branch
git checkout --track origin/branch
我认为两者都跟踪远程分支,以便我可以将更改推送到原始分支,对吗?
有什么实际区别吗?
这两个命令具有相同的效果(感谢 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
and--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 分支跟踪远程分支? ”。
完全没有区别!
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/branch
if “branch” 尚不存在但 “origin/branch” 存在1。
所有三个命令都将“branch”的“upstream”设置为“origin/branch”(否则它们会失败)。
Upstream 用作无参数 , 的参考点git status
,git push
因此git merge
(git pull
如果这样配置(这是默认值或几乎默认值))。
例如git status
,如果配置了上游,则告诉您落后或领先上游多远。
git push
配置为从 git 2.0 开始默认将当前分支推送到上游2 。
1 ...如果“origin”是唯一具有“branch”的遥控器</sup>
2默认(命名为“simple”)也强制两个分支名称相等
这本书似乎表明这些命令产生相同的效果:
简单的例子就是你刚才看到的例子,运行 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