2011-07-28 36 views
11

我有一個名爲foo的git分支。Git讀取並且不帶參數

> git status 
# On branch foo 
nothing to commit (working directory clean) 

它最初簽出使用這個命令:

> git checkout origin/foo -b foo --track 

我想從遠程倉庫獲得更新到這個分支。我知道這些命令的就足夠了:

> git fetch origin foo # ignore the lack of merging 
> git pull origin foo 

如果我忽略的參數fetchpull,將默認的git獲取到(或拉動),我目前已簽出的分支?也就是說,下面的命令對等效嗎?

> git checkout foo 
> git pull 

> git checkout foo 
> git pull origin foo 

回答

19

不幸的是,無論他們是在一般等價物與否取決於哪支你是,你的配置,月亮的相位等

您可以從git pull手冊頁想出解決辦法,因爲我如下所述,但我通常會盡量避免必須通過這樣做來解決:git fetch origin,然後git merge origin/foo。 (我寫了一個somewhat rambling blog post about this。)

但是,當你沒有指定remote或refspec時,你的問題實際上是關於git pull的默認行爲。我們可以從git pull man page,特別是DEFAULT BEHAVIOUR section中得出結論。這是有點難以弄清楚的,所以我已經大膽地提出了真正適用於您的問題的唯一部分,因爲(a)您在分支機構foo上,(b)您按照問題中所述創建了該分支,和(c)你沒有改變你的配置。

通常人們不使用任何參數就使用git pull。傳統上,這相當於說git pull origin然而,當分支<name>上存在配置branch.<name>.remote時,使用該值代替origin

爲了確定使用什麼URL取回,配置remote.<origin>.url的值被查詢,如果沒有任何這樣的變量,則使用行的值在$GIT_DIR/remotes/<origin>文件中。

爲了確定在命令行中沒有任何refspec參數運行該命令時要訪問哪些遠程分支(並可選擇存儲在遠程跟蹤分支中),需要查看配置變量remote.<origin>.fetch的值,如果有沒有任何,$GIT_DIR/remotes/<origin>文件被查閱和它的Pull:行被使用。除了在選項部分中描述的的Refspec格式,你可以有一個通配的Refspec,看起來像這樣:

refs/heads/*:refs/remotes/origin/*

一個通配符的Refspec必須有一個非空的RHS(即必須存儲在什麼是牽強遠程跟蹤分支),其LHS和RHS必須以/*結束。以上規定,所有遠程分行都使用同名的refs/remotes/origin/層次結構中的遠程跟蹤分支進行跟蹤。

確定在取回後要合併哪個遠程分支的規則有點涉及,以便不破壞向後兼容性。

如果在git pull的命令行上給出了明確的refspecs,它們全部被合併。

當在命令行上沒有給出refspec時,那麼git pull使用來自配置或$GIT_DIR/remotes/<origin>的refspec。在這種情況下,適用下列規則:

  1. If branch.<name>.merge配置當前分支存在,也就是在那個合併遠程站點的分支的名稱。

  2. 如果refspec是通配符,則不會合並。

  3. 否則,合併第一個refspec的遠程分支。

當你創建分支foo有:

git checkout origin/foo -b foo --track 

...這將已經設置以下配置選項,您的分支foorefs/heads/fooorigin倉庫關聯:

branch.foo.remote=origin 
branch.foo.merge=refs/heads/foo 

所以,如果你把這些與底氣一起上面的答案是「是的,在你描述的這種情況下,當你在分支foo上時,命令git pullgit pull origin foo是等同的。」

+0

他們不是能完全等同 - - 請參閱我的答案瞭解詳情。 –

1

是的,他們是。跟蹤信息保存在.git/config

3

即使在Mark描述的條件下,當它們看起來相同時,仍然存在細微的差異 - git pull origin foo不會更新遠程跟蹤分支,而git pull會。這在聯機幫助頁記錄的混帳拉:

A parameter <ref> without a colon is equivalent to <ref>: when pulling/fetching, so it merges <ref> into the current branch without storing the remote branch anywhere locally

所以你的情況,對於真正相當於git pull,你需要做的git pull origin foo:refs/remotes/origin/foo

相關問題