有人知道切换和跟踪远程分支这两个命令之间的区别吗?
git checkout -b branch origin/branch
git checkout --track origin/branch
我认为两者都跟踪远程分支,所以我可以将我的更改推送到原点上的分支,对吧?
有什么实际差异吗?
谢谢!
这两个命令具有相同的效果(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的Sebastian Graf,如果当地分支不存在的话。
如果是的话,你需要git checkout -B abranch origin/abranch
)
首先,一些背景:跟踪意味着本地分支的上游设置为远程分支:
# 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?”。
完全没有区别!
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
,而-b
的论点被认为是“分支”。猜测由配置变量remote.origin.fetch
驱动。
实际上,2)表现得像git checkout -b branch --track origin/branch
。
如你所见:没有区别。
但它变得更好:
3)git checkout branch
如果“分支”不存在但“起源/分支”确实1,则也相当于git checkout -b branch --track origin/branch
。
所有三个命令都将“branch”的“upstream”设置为“origin / branch”(或者它们失败)。
上游被用作参数较少的git status
,git push
,git merge
以及git pull
的参考点(如果配置为(默认或几乎默认))。
例如。 git status
告诉你,如果配置了上游,你的上游有多远或多远。
git push
配置为自git 2.0以来默认推送当前分支2。
1 ...如果“origin”是唯一具有“分支”的遥控器 2默认(名为“simple”)也强制两个分支名称相等
The book似乎表明这些命令产生相同的效果:
简单的例子就是你刚看到的例子,运行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