有人知道切换和跟踪远程分支这两个命令之间的区别吗?
git checkout -b branch origin/branch
git checkout --track origin/branch
我认为两者都跟踪远程分支,所以我可以将我的更改推送到原点上的分支,对吗?
有任何实际差异吗?
谢谢!
答案 0 :(得分:228)
这两个命令具有相同的效果(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 branch
,如果本地分支不已经存在。
如果是,则需要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 --set-upstream-to
)并跟踪远程跟踪分支origin/branch
。 当从远程跟踪分支启动本地分支时,Git会设置分支(特别是
branch.<name>.remote
和branch.<name>.merge
配置条目),以便{{1将从远程跟踪分支中适当地合并 可以通过全局git pull
配置标志更改此行为。可以使用branch.autosetupmerge
和--track
选项覆盖该设置,稍后使用git branch--no-track
进行更改。
而--set-upstream-to
将与git1.8.0-rc1 announce完全相同:
git checkout --track origin/branch
它还会设置“ # 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
”的上游。
(注意:git1.8.0将弃用branch
并将其替换为git branch --set-upstream
:请参阅How do you make an existing git branch track a remote branch?)
为本地分支注册上游分支将:
git branch -u|--set-upstream-to
和git status
中两个分支之间的关系。 git branch -v
不带参数在签出新分支时从上游拉出。有关详情,请参阅“{{3}}”。
答案 1 :(得分:26)
完全没有区别!
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
也等同于git checkout -b branch --track origin/branch
如果“branch”尚不存在但“origin / branch”确实 1 。
所有三个命令都将“branch”的“upstream”设置为“origin / branch”(或者它们失败)。
上游被用作无参数git status
,git push
,git merge
以及git pull
的参考点(如果这样配置(这是默认的或几乎是默认))。
E.g。如果配置了上游,git status
会告诉您上游的前后距离。
git push
被配置为从git 2.0开始默认推送当前分支 2 。
1 ...如果“origin”是唯一具有“分支”的远程
2 默认(名为“simple”)也强制两个分支名称相等
答案 2 :(得分:5)
The book似乎表明这些命令会产生相同的效果:
简单的例子是你刚才看到的例子,运行git checkout -b [分支] [remotename] / [分支]。如果你有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
)你正在路上。
答案 3 :(得分:-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