有没有人知道这两个命令切换和跟踪远程分支的区别?git checkout --track origin/branch和git checkout -b branch branch/branch之间的区别
git checkout -b branch origin/branch
git checkout --track origin/branch
我认为都跟踪远程分支,所以我可以推动我的变化到原产地的分支,对不对?
有什么实际区别?
谢谢!
有没有人知道这两个命令切换和跟踪远程分支的区别?git checkout --track origin/branch和git checkout -b branch branch/branch之间的区别
git checkout -b branch origin/branch
git checkout --track origin/branch
我认为都跟踪远程分支,所以我可以推动我的变化到原产地的分支,对不对?
有什么实际区别?
谢谢!
这两个命令具有相同的效果(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 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
)并跟踪远程跟踪分支origin/branch
。当本地分支开始了一个远程跟踪分支,GIT中设置的分支(特别是
branch.<name>.remote
和branch.<name>.merge
配置条目)使得git pull
将适当地从远程跟踪分支合并。
此行为可能会通过全局branch.autosetupmerge
配置标志进行更改。该设置可以通过使用--track
和--no-track
选项进行覆盖,并在稍后使用git分支--set-upstream-to
进行更改。
而且git checkout --track origin/branch
会做同样的:
# or, since 1.7.0
git branch --set-upstream branch upstream/branch
# or, since 1.8.0 (October 2012)
git branch --set-upstream-to branch upstream/branch
# the short version remains the same:
git branch -u branch upstream/branch
这也将设置为上游 'branch
'。
(注:git1.8.0将弃用git branch --set-upstream
与git branch -u|--set-upstream-to
替换:见git1.8.0-rc1 announce)
具有本地分行将注册的上游分支:
git status
和git branch -v
两个分支之间的关系。git pull
无参数当检出新分支时从上游拉出。有关更多信息,请参阅“How do you make an existing git branch track a remote branch?”。
The book似乎表明,这些命令产生相同的效果:
简单的情况就是你刚才看到的例子,运行git结帐-b [分支] [远程名]/[分支。如果你的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的落成是AB这是特别方便le拉origin/serverfix
名称 - 只需追加--track
(或-t
),你就在路上。
完全没有区别!
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
如果“分支”还不存在,但“出身/分支”确实。
所有这三个命令都将“分支”的“上游”设置为“原点/分支”(或它们失败)。
上游被用作参考点的参数少git status
,git push
,git merge
因此git pull
(如果配置这样的(这是默认值或几乎默认))。
E.g. git status
告诉你,如果配置了上游或下游,则上游有多远。
git push
被配置为从git 2.0开始推动默认的当前分支上游。
...如果“原产地”是唯一的远程有“分支”
默认(命名为“简单”)也强制执行两个分支名称相等
@VonC我一直在寻找你偶然提及的那些细节,作为额外的信息。就我而言,我很好奇为什么我的一些分支允许我“拉扯”,而有些分支会要求一个远程分支从中拉出。事实证明,如果你第一次检查你的同行创建的远程分支,git会继续并添加分支。 .remote = origin'到本地gitconfig。然后允许你发出'git pull'。但是,如果您是创建分支'git checkout -b BNAME'的人,那么git -of course-不知道。所以你应该指定它的远程。 –
batilc
2016-12-23 07:56:49
@batilc“事实证明,如果你第一次检查你的同伴创建的远程分支,”;是的,阅读https://git-scm.com/docs/git-checkout,我看到:“'如果找不到',但确实存在跟踪分支在一个遥控器(称为”')与一个匹配的名称,视为等价于'$ git checkout -b --track /'“ –
VonC
2016-12-23 08:00:21
@VonC我找到了一个更好的配置。将'branch.autoSetupMerge'设置为'always'只需执行我们正在谈论的内容。此设置默认为“true”,这意味着只有在检出远程分支时才执行跟踪。 'true'不会为本地创建的分支设置跟踪。 – batilc 2016-12-26 06:39:06