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

yor*_*rch 196 git branch git-checkout git-branch

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

git checkout -b branch origin/branch
git checkout --track origin/branch
Run Code Online (Sandbox Code Playgroud)

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

有什么实际差异吗?

谢谢!

Von*_*onC 260

这两个命令具有相同的效果(感谢Robert Siemer的答案指出它).

使用不同名称的本地分支时会出现实际差异:

  • git checkout -b mybranch origin/abranch将创建mybranch和跟踪origin/abranch
  • git checkout --track origin/abranch将只创建' abranch',而不是具有不同名称的分支.

(也就是说,正如塞巴斯蒂安·格拉夫所评论的那样,如果当地的分支机构已经存在了.
如果确实如此,你需要git checkout -B abranch origin/abranch)


首先,一些背景:跟踪意味着本地分支的上游设置为远程分支:

git switch -c <branch> --track <remote>/<branch>
Run Code Online (Sandbox Code Playgroud)

git switch 将:

  • 创建/重置checkout.defaultRemote到引用的点<branch>.
  • 创建分支checkout.defaultRemote=origin(带<branch>)并跟踪远程跟踪分支-c.

当本地分支开始了一个远程跟踪分支,GIT中设置分支(特别是-bgit checkout -b branch origin/branch配置条目),从而branch将适当地从远程跟踪分支合并.
可以通过全局origin/branch配置标志更改此行为.可以使用branchgit branch选项覆盖该设置,稍后使用git branch更改origin/branch.


branch.<name>.remote会做一样的branch.<name>.merge):

# git config branch.<branch-name>.remote origin
# git config branch.<branch-name>.merge refs/heads/branch
Run Code Online (Sandbox Code Playgroud)

它还会为' git pull' 设置上游.

(注意:git1.8.0将弃用branch.autosetupmerge并替换为--track:请参阅git1.8.0-rc1 announce)


为本地分支注册上游分支将:

  • 通知Git 显示在两个分支之间的关系--no-track--set-upstream-to.
  • 在检查新分支时,git checkout --track origin/branch 不带参数的指示从上游拉出.

有关更多信息,请参阅" 如何使现有git分支跟踪远程分支? ".


Rob*_*mer 30

完全没有区别!

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(如果配置这样的(这是默认值或几乎默认)).

例如git status,如果配置了上游,请告诉您上游的前后距离.

git push配置为从git 2.0开始默认将当前分支推送到上游2.

1 ...如果"origin"是唯一具有"branch" 2遥控器,则默认(名为"simple")强制两个分支名称相等


Pat*_*Pat 5

这本书似乎表明这些命令会产生同样的效果:

简单的例子就是你刚看到的例子,运行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' 
Run Code Online (Sandbox Code Playgroud)

要设置名称与远程分支不同的本地分支,可以轻松地使用具有不同本地分支名称的第一个版本:

$ git checkout -b sf origin/serverfix
Run Code Online (Sandbox Code Playgroud)

当你的bash或oh-my-zsh git完成能够origin/serverfix为你拉出名字时,这是特别方便的- 只需追加--track(或-t)你正在路上.