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

问题描述 投票:161回答:4

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

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

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

有什么实际差异吗?

谢谢!

git branch git-branch git-checkout
4个回答
237
投票

这两个命令具有相同的效果(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 commentedSebastian 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将:

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

当从远程跟踪分支启动本地分支时,Git设置分支(特别是branch.<name>.remotebranch.<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显示git statusgit branch -v中两个分支之间的关系。
  • 在检查新分支时,指示git pull不带参数从上游拉出。

有关更多信息,请参阅“How do you make an existing git branch track a remote branch?”。


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

如果“分支”不存在但“起源/分支”确实1,则也相当于git checkout -b branch --track origin/branch


所有三个命令都将“branch”的“upstream”设置为“origin / branch”(或者它们失败)。

上游被用作参数较少的git statusgit pushgit merge以及git pull的参考点(如果配置为(默认或几乎默认))。

例如。 git status告诉你,如果配置了上游,你的上游有多远或多远。

git push配置为自git 2.0以来默认推送当前分支2。

1 ...如果“origin”是唯一具有“分支”的遥控器 2默认(名为“simple”)也强制两个分支名称相等


5
投票

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),你就在路上。


-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
© www.soinside.com 2019 - 2024. All rights reserved.