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

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

我想两者都在跟踪远程分支所以我可以在原点上把我的更改推到分支,对吧?

有什么实际的区别吗?


这两个命令具有相同的效果(感谢Robert Siemer的回答指出了这一点)。

实际的区别在于使用不同名称的本地分支:

Git checkout -b mybranch origin/ branch将创建mybranch并跟踪origin/ branch Git checkout -track origin/ branch将只创建“分支”,而不是具有不同名称的分支。

(也就是说,正如塞巴斯蒂安·格拉夫所评论的那样,如果当地分支已经不存在的话。 如果是的话,你需要git checkout -B branch origin/ branch)


注意:在Git 2.23(2019年Q3)中,将使用新的命令Git switch:

git switch -c <branch> --track <remote>/<branch>

如果分支存在于多个远程中,并且其中一个由checkout.defaultRemote配置变量命名,我们将使用该变量来消除歧异,即使<分支>在所有远程中不是唯一的。 设置它为check - out. defaultremote =origin,如果<branch>是不明确的,但存在于'origin'远程上,则总是从那里签出远程分支。

这里,'-c'是新的'-b'。


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

# git config branch.<branch-name>.remote origin
# git config branch.<branch-name>.merge refs/heads/branch

Git checkout -b branch origin/branch将:

创建/重置分支到原点/分支引用的点。 创建分支分支(使用git分支)并跟踪远程跟踪分支原点/分支。

当一个本地分支从一个远程跟踪分支启动时,Git会设置这个分支(特别是分支。<name>。远程和分支。<name>。合并配置项),这样git拉将适当地从远程跟踪分支合并。 这种行为可以通过全局分支来改变。Autosetupmerge配置标志。这个设置可以通过使用——track和——no-track选项来覆盖,然后使用git分支——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

它还将上游设置为“分支”。

(注意:git1.8.0将弃用git分支——set-upstream,并替换为git分支-u|——set-upstream-to:参见git1.8.0-rc1 announce)


上游分支机构向本地分支机构注册将:

告诉git在git status和git branch -v中显示两个分支之间的关系。 在签出新分支时,引导git不带参数地从上游进行拉取。

有关更多信息,请参见“如何让现有git分支跟踪远程分支?”


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

简单的例子就是刚才看到的,运行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),你就可以继续了。


根本没有区别!

1) git checkout -b branch origin/branch

如果没有——track和没有——no-track,——track将被假设为默认值。可以通过设置branch.autosetupmerge来更改默认值。

实际上,1)行为类似于git checkout -b branch—跟踪origin/branch。

2) git结帐—跟踪原点/分支

“方便起见”,不带-b的——track表示-b, -b的参数被猜测为“branch”。猜测是由配置变量remote.origin.fetch驱动的。

实际上,2)行为类似于git checkout -b branch—跟踪origin/branch。

正如你所看到的:没有区别。

但还有更好的:

3) git结帐分支

也等价于git checkout -b branch——如果“branch”不存在,而“origin/branch”存在,则跟踪origin/branch。


这三个命令都将“branch”的“upstream”设置为“origin/branch”(否则会失败)。

Upstream被用作无参数git状态、git push、git merge和git pull的参考点(如果这样配置的话(这是默认的或几乎是默认的)。

例如,git状态告诉你你落后或领先上游多远,如果配置了一个。

从Git 2.0开始,Git push被配置为通过default2向上游推送当前分支。

1……如果" origin "是唯一具有" branch "的远程 默认值(命名为" simple ")也强制两个分支名称相等


你不能用这个命令创建一个新的分支

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