git checkout --track origin / branch和git checkout -b branch origin / branch之间的区别

时间:2012-04-03 22:15:53

标签: git branch git-branch git-checkout

有人知道切换和跟踪远程分支这两个命令之间的区别吗?

git checkout -b branch origin/branch
git checkout --track origin/branch

我认为两者都跟踪远程分支,所以我可以将我的更改推送到原点上的分支,对吗?

有任何实际差异吗?

谢谢!

4 个答案:

答案 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 Grafgit 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将:

  • 创建/重置branchorigin/branch引用的点。
  • 创建分支branch(使用git branch --set-upstream-to)并跟踪远程跟踪分支origin/branch
  

当从远程跟踪分支启动本地分支时,Git会设置分支(特别是branch.<name>.remotebranch.<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 显示git branch -u|--set-upstream-togit 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 statusgit pushgit 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