[英]Why do I need the “master” in git merge origin/master?
使用git並希望從服務器獲取更改時的約定是:
git fetch
git merge origin/master
我知道還有git pull
,但我的具體問題是關於語法origin/master
。 master
部分做什么? 如果我只是做git merge origin
(沒有master
)它似乎工作。 我知道master
是一個分支,但是如果我跟蹤一個以上的遠程分支,那么正常的用例是否會合並所有這些分支?
當未指定分支時, git merge origin
將合並在從origin
遠程(通常為master
)設置為默認的任何分支中。 在這種情況下, git merge origin
和git merge origin/master
將做同樣的事情。 但是,如果要在origin
的不同分支中合並,則必須指定分支。
要merge
的參數merge
解析為commit-ID。 這意味着應用了gitrevisions中的規則。 通常, origin/ name
解析為git fetch
和git push
之一的“遠程分支”在每次獲取和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
是相當不同的,並且更古老,完全超越了“遠程跟蹤分支”的整個想法。 1這種偶然的相似之處,我認為是很多混亂的根源(我知道多年前我發現它很混亂)。
1具體來說,您曾經(並且仍然可以)從URL而不是“遠程”名稱進行git pull
。 這通常會(並且仍然)轉移到另一個git存儲庫,並獲得至少一些分支的列表(有時只是感興趣的一個)。 但是,因為它們是它的分支而不是你的分支,所以它們被記錄在名為FETCH_HEAD
的文件中。 所以在這一點上,它會從“那里”帶來master
,但把它放到FETCH_HEAD
而不是遠程跟蹤分支 - 用原始URL,你沒有遠程名稱,所以沒有辦法命名遠程跟蹤分支:有沒有origin
與構建前綴refs/remotes/origin
。 然后git-pull
的master
參數意味着:“通過FETCH_HEAD
搜索以找到它們的master
分支。”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.