【发布时间】:2012-04-17 15:17:07
【问题描述】:
有人知道这两个切换和跟踪远程分支的命令之间的区别吗?
git checkout -b branch origin/branch
git checkout --track origin/branch
我认为两者都会跟踪远程分支,这样我就可以将我的更改推送到源分支,对吧?
有什么实际区别吗?
【问题讨论】:
标签: git branch git-branch git-checkout
有人知道这两个切换和跟踪远程分支的命令之间的区别吗?
git checkout -b branch origin/branch
git checkout --track origin/branch
我认为两者都会跟踪远程分支,这样我就可以将我的更改推送到源分支,对吧?
有什么实际区别吗?
【问题讨论】:
标签: git branch git-branch git-checkout
这两个命令具有相同的效果(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 by Sebastian Graf,如果本地分支确实不已经存在。
如果是这样,您将需要git checkout -B abranch origin/abranch)
注意:对于 Git 2.23(2019 年第三季度),这将使用 new command 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-rc1 announce)
为本地分支注册一个上游分支将:
git status 和git branch -v 中显示两个分支之间的关系。 git pull不带参数在新分支签出时从上游拉取。请参阅“How do you make an existing git branch track a remote branch?”了解更多信息。
【讨论】:
git pull,而一些分支会要求从远程分支中提取。事实证明,如果您第一次检查您的对等创建的远程分支,git 会继续并将branch.<BNAME>.remote=origin 添加到本地 gitconfig。然后允许您发出git pull。但是,如果您是创建分支 git checkout -b BNAME 的人,那么 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
“为方便起见”,没有-b 的--track 暗示-b 并且-b 的参数被猜测为“分支”。猜测是由配置变量remote.origin.fetch驱动的。
实际上,2) 的行为类似于 git checkout -b branch --track origin/branch。
如您所见:没有区别。
但它变得更好:
3)git checkout branch
也等价于git checkout -b branch --track origin/branch,如果“branch”尚不存在但“origin/branch”存在1。
所有三个命令都将“branch”的“upstream”设置为“origin/branch”(否则会失败)。
上游被用作无参数git status、git push、git merge 和git pull 的参考点(如果这样配置(默认或几乎默认))。
例如git status 告诉你你落后或领先上游多远(如果已配置)。
git push 配置为默认将当前分支推送到上游2 从 git 2.0 开始。
1 ...如果“origin”是唯一具有“branch”的遥控器
2默认(命名为“简单”)也强制两个分支名称相等
【讨论】:
The book 似乎表明这些命令产生相同的效果:
简单的例子就是你刚才看到的例子,运行 git checkout -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 完成能够为您提取 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。你知道吗?