2012-04-03 142 views

回答

157

這兩個命令具有相同的效果(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

  • 創建/重置branchorigin/branch參考點。
  • 創建分支branch(與git branch)並跟蹤遠程跟蹤分支origin/branch

當本地分支開始了一個遠程跟蹤分支,GIT中設置的分支(特別是branch.<name>.remotebranch.<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-upstreamgit 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?」。

+0

@VonC我一直在尋找你偶然提及的那些細節,作爲額外的信息。就我而言,我很好奇爲什麼我的一些分支允許我「拉扯」,而有些分支會要求一個遠程分支從中拉出。事實證明,如果你第一次檢查你的同行創建的遠程分支,git會繼續並添加分支。 .remote = origin'到本地gitconfig。然後允許你發出'git pull'。但是,如果您是創建分支'git checkout -b BNAME'的人,那麼git -of course-不知道。所以你應該指定它的遠程。 – batilc 2016-12-23 07:56:49

+0

@batilc「事實證明,如果你第一次檢查你的同伴創建的遠程分支,」;是的,閱讀https://git-scm.com/docs/git-checkout,我看到:「'如果找不到',但確實存在跟蹤分支在一個遙控器(稱爲」')與一個匹配的名稱,視爲等價於'$ git checkout -b --track /'「 – VonC 2016-12-23 08:00:21

+0

@VonC我找到了一個更好的配置。將'branch.autoSetupMerge'設置爲'always'只需執行我們正在談論的內容。此設置默認爲「true」,這意味着只有在檢出遠程分支時才執行跟蹤。 'true'不會爲本地創建的分支設置跟蹤。 – batilc 2016-12-26 06:39:06

5

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

18

完全沒有區別!

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 statusgit pushgit merge因此git pull(如果配置這樣的(這是默認值或幾乎默認))。

E.g. git status告訴你,如果配置了上游或下游,則上游有多遠。

git push被配置爲從git 2.0開始推動默認的當前分支上游。

...如果「原產地」是唯一的遠程有「分支」
默認(命名爲「簡單」)強制執行兩個分支名稱相等

相關問題