公約使用Git,你想從服務器獲取的變化時:爲什麼我需要git merge origin/master中的「master」?
git fetch
git merge origin/master
我知道也有git pull
,但我的具體問題是關於語法origin/master
。 master
部分是做什麼的?如果我只是git merge origin
(沒有master
),它似乎工作。我知道master
是一個分支,但是如果我跟蹤遠程的多個分支,那麼正常用例是否會將所有分支合併?
公約使用Git,你想從服務器獲取的變化時:爲什麼我需要git merge origin/master中的「master」?
git fetch
git merge origin/master
我知道也有git pull
,但我的具體問題是關於語法origin/master
。 master
部分是做什麼的?如果我只是git merge origin
(沒有master
),它似乎工作。我知道master
是一個分支,但是如果我跟蹤遠程的多個分支,那麼正常用例是否會將所有分支合併?
將merge
的參數解析爲commit-IDs。這意味着應用gitrevisions中的規則。一般而言,origin/name
解決了「遠程分支」之一git fetch
和git 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/origin
。 git-pull
的master
參數則表示:「通過FETCH_HEAD
去搜索以找到它們的master
分支。」
未指定分支時,git merge origin
將合併到遠程(通常爲master
)的默認設置的任何分支中。在這種情況下,git merge origin
和git merge origin/master
將執行相同的操作。如果你想合併一個不同於origin
的分支,你必須指定分支。
更具體地說,根據[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
簡短的回答可能是「看gitrevisions」,但解釋爲什麼git推拉看起來不同,也有獎勵點。 :) –