2014-11-22 368 views
15

正如我所看到的,git --track--set-upstream-to修改了一個分支,因此它變成了一個跟蹤(或上游)分支。但我無法理解的細微差別在哪裏。該--track記錄「遠程分支軌道地方」:git「--track」和「--set-upstream-to」有什麼區別?

$ git checkout foo -b 
$ git branch --track origin/retarget 

Branch origin/retarget set up to track local branch foo. 

$ cat .git/config 
[branch "origin/retarget"] 
     remote = . 
     merge = refs/heads/foo 

雖然--set-upstream-to紀錄「的本地分支軌道遠程分支」:

$ git checkout foo -b 
$ git branch --set-upstream-to origin/retarget 

Branch foo set up to track remote branch retarget from origin. 

$ cat .git/config 
[branch "foo"] 
     remote = origin 
     merge = refs/heads/retarget 

這是什麼兩者之間的區別?我確信「跟蹤分支」是一個簡單的概念,其中額外的upstream分支內的指針跟蹤head指定分支在remote存儲庫中的位置。但似乎更復雜?

回答

6
$ git checkout foo -b 
$ git branch --track origin/retarget 

前兩個命令指示GIT中:

  • 創建一個名爲「origin/retarget」(非常糟糕的主意本地分支,因爲它被命名爲遠程跟蹤分支」,而它實際上一個是簡單的本地分支在其名稱中的「/」)
  • 從當前分支開始(「foo」,另一個地方分支)
  • 作出新的本地分支跟蹤它的出發點。

參見git branch

--track 

當創建一個新的分支,建立branch.<name>.remotebranch.<name>.merge配置條目到起始點分支標記爲從新的支路「上游」。

從遠程跟蹤開始創建分支時,您將使用跟蹤。

換句話說,你的第一個例子不是你將如何使用--track
這將更好的工作:

git checkout -b foo --track origin/retarget 

至於--track--set-upstream-to之間的區別:

--set-upstream-to 

如果指定的分支不存在,或者如果--force已經給出,行爲完全像--track
否則,在創建分支時會設置像--track這樣的配置,除非分支指向的地方不會更改

3

我們假設您有一個master分支已簽出。現在,當你做一個

$ git branch --track someBranch 

您將創建一個名爲someBranch新的分支,它的變化將根據master分支進行跟蹤。但是這個分支沒有設置遠程分支。因此你在git配置中看到remote = .

現在someBranch被跟蹤,這意味着改變將出現在git statusgit branch -v就好像一個遠程存在一樣。

例如,如果你犯了一個提交上someBranch git會告訴你,你是1 ahead當你做一個git branch -v或當你做一個git status這表明你

Your branch is ahead of 'master' by 1 commit. 

這是interessting一部分。該分支被跟蹤,git向您顯示它提前1提交master(當您創建someBranch時簽出的分支)