2014-02-26 58 views
3

公約使用Git,你想從服務器獲取的變化時:爲什麼我需要git merge origin/master中的「master」?

git fetch

git merge origin/master

我知道也有git pull,但我的具體問題是關於語法origin/mastermaster部分是做什麼的?如果我只是git merge origin(沒有master),它似乎工作。我知道master是一個分支,但是如果我跟蹤遠程的多個分支,那麼正常用例是否會將所有分支合併?

回答

4

merge的參數解析爲commit-IDs。這意味着應用gitrevisions中的規則。一般而言,origin/name解決了「遠程分支」之一git fetchgit push在每次讀取和推送時保持最新。

「遠程分支」也稱爲「遠程追蹤分支」,簡單說就是一個分支式標籤,其「全名」以refs/remotes/開頭。對於名爲origin的遠程設備,所有的都在refs/remotes/origin/。在正常操作中,git fetch會諮詢一些遠程(如origin)git存儲庫並詢問:「嘿,你在那邊有什麼分支,以及它們的SHA-1值是什麼?」當它得到答案時,它將它們存儲在本地,您的 git存儲庫:refs/remotes/origin/master,refs/remotes/origin/devel等等。這樣可以讓你知道什麼東西看起來像「在那邊」,上次你的git有機會同步。

這些不應與git調用「跟蹤分支」(或「本地跟蹤分支」)混淆。本地分行是「全名」以refs/heads/開頭的標籤。如果他們有與之相關的「上游」信息,他們就被視爲「跟蹤」。您可以在首次創建分支時輸入上游信息 - 典型情況下,本地分支的名稱與遠程分支的名稱「相同」,例如master vs origin/master - 或者您可以稍後設置(或更改) git branch --set-upstream-to

這些所有來自git pull語法不同:git pull origin master是相當不同的,大年紀了,比羅馬的「遠程跟蹤分支」完全的整體思路。 這種偶然的相似之處,我認爲是很多混亂的根源(我知道我發現它很混亂,多年前)。


具體而言,從一個URL用來(並且仍然能)git pull而不是一個 「遠程」 的名稱。像往常一樣,它已經(並且仍然會)轉到另一個git存儲庫,並且獲得了至少一些分支的列表(有時候只是一個感興趣的分支)。但是,因爲那些是分支,而不是你的分支,所以它們被記錄在名爲FETCH_HEAD的文件中。所以在這一點上,它將從「那裏」帶來master,但將它放到FETCH_HEAD而不是一個遠程跟蹤分支 - 帶有一個原始URL,您沒有遠程名稱,所以沒有辦法名稱遠程追蹤分支:沒有origin,用於構建前綴refs/remotes/origingit-pullmaster參數則表示:「通過FETCH_HEAD去搜索以找到它們的master分支。」

+0

簡短的回答可能是「看gitrevisions」,但解釋爲什麼git推拉看起來不同,也有獎勵點。 :) –

4

未指定分支時,git merge origin將合併到遠程(通常爲master)的默認設置的任何分支中。在這種情況下,git merge origingit merge origin/master將執行相同的操作。如果你想合併一個不同於origin的分支,你必須指定分支。

+1

更具體地說,根據[gitrevisions](https://www.kernel.org/pub/software/scm/git/docs/gitrevisions.html),'origin'匹配'refs/remotes/origin/HEAD ',如果存在的話。它不在這裏(在這裏的測試回購):'git merge origin'說'merge:origin--不是我們可以合併的東西',而是'git merge origin/master'合併(或者在這種情況下說''已經合格-date.')。 – torek

相關問題