這些是什麼命令之間的差異?:當從原點拉動時,「git pull」命令之間的區別?
# 1
git pull
# 2
git pull origin
# 3
git pull origin master
# 4
git pull origin/master
# 5
git pull origin HEAD:master
這些是什麼命令之間的差異?:當從原點拉動時,「git pull」命令之間的區別?
# 1
git pull
# 2
git pull origin
# 3
git pull origin master
# 4
git pull origin/master
# 5
git pull origin HEAD:master
git pull
是一個方便的命令,這是在同一時間做不同的事情。基本上,它只是git fetch
(它連接到遠程存儲庫並獲取新提交)和git merge
(或git rebase
)的組合,它將新提交合併到本地分支中。由於涉及兩個不同的命令,所以git pull
的含義並不總是顯而易見的。
您可以爲本地分支配置上游。新鮮克隆後,您將有一個本地分支「主」,一個遠程「起源」,您的主分支具有「起源/主」作爲上游。 我假設下面這個設置。 (你可以看到你的上游配置有git branch -vv
或通過查看的.git /配置)。
現在對於你的問題:
git pull
= git fetch origin
+ git merge origin/master
(或任何你的上游)git pull origin
= git pull
(只要原點是您的上游遠程)git pull origin master
= git fetch origin master
+ git merge FETCH_HEAD
git pull origin/master
:除非你有一個名爲「origin/master」的遠程設備,否則無效。git pull origin HEAD:master
:嘗試直接將本地主設備重置爲任何HEAD指向原點的設備。 (別這樣做。)爲什麼執行'git pull origin HEAD:master'是一個壞主意? – 2013-04-03 22:49:18
右側應該是一個遠程分支。請參閱手冊頁中的警告。如果你使用這個,確保你知道你在做什麼。 – michas 2013-04-03 23:06:05
如果我在其他分支會'git pull'拉那個分支或者主人 – aWebDeveloper 2014-02-07 09:37:12
一個pull
基本上是一個fetch
(後者從遠程倉庫到你的一些提交和相關對象),然後其中「適用」的操作到這些工作拷貝。第二階段默認情況下是使用merge
完成的,但您可以將pull.rebase
變量設置爲true
,然後它將改爲rebase。
命令pull
彈出兩個問題。首先是,究竟獲取了什麼?第二個是,它如何將這些更改應用於我的工作副本?我們從第一個開始。該命令的完整形式是
git pull [options] [repository] [<refspec>...]
的options
是控制行爲的標誌(例如--rebase使pull
工作作爲fetch
+ rebase
即使pull.rebase
是false
)。
repository
是要從中獲取的遠程名稱(或URL)。
refspecs
是一種簡潔的方式,用於指定您要獲取的遠程引用,以及您希望將它們放入當前工作副本的位置。
讓我們先採取最明確的形式。
git pull origin branch1:branch2
這基本上說,拉遠程被叫origin
在參考branch1
的變化,然後合併(或重訂)他們到當地分支機構branch2
。例如,如果我說git pull origin master:dev
,我會得到一個名爲dev
的本地分支,它將指向與master
相同的提交。如何指定參考文獻的細節是here。您可以使用*
來指示多個refspecs。例如,git pull origin refs/heads/*:refs/heads/*
將把所有分支(存儲在heads
中)拉入本地存儲庫並將它們合併到具有相同名稱的本地分支中。
現在,讓我們逐個刪除參數來討論默認的工作方式。首先,我們可以從我們的refspec中刪除目的地,並簡單地說git pull origin branch1
。這將首先將fetch
遠程分支branch1
放入您的本地存儲庫。它將作爲臨時參考號FETCH_HEAD
提供。之後,它將運行git merge FETCH_HEAD
,它會將此分支合併到當前的活動分支中(即HEAD
)。這通常是在您位於本地分支並希望從遠程訪問該分支時進行的。
現在,讓我們完全放棄branch1
並且只是說git pull origin
。現在,git知道從哪裏獲取(origin
),但不知道要獲取什麼。它有一些默認設置。大多數情況是當你的配置文件有一個branch.<name>.merge
選項時(這是一個在[branch "master"]
這個部分裏面叫merge
的條目)。如果是這樣,它將使用該操作的refspecs。
如果我們完全放下origin
,簡單地說git pull
,它將檢查的配置,看看是否有一個branch.<name>.remote
指定哪個遠離拉。隨着上述,告訴你要拉什麼。
您的要點#4和#5不是正常使用情況。第一個是有道理的,如果你有一個叫做origin/master
的遙控器,這不太可能。 origin/master
是通常是本地參考,它跟蹤遠程origin
上的master
分支。第二個將嘗試在遙控器(默認分支通常爲master
)上獲取HEAD
上的更改,然後將這些更改合併到您的本地master
。雖然這可能是你想要定期做的事情,但這個命令並不常見,而且也不是我經常見到的。
我已經略過了一些細節,但這些應該足以讓您在日常工作中保持安全和舒適。對於所有血腥詳細信息,您可以查看手冊頁面git pull
。
那麼,即使在閱讀手冊頁後,並不是所有情況下都清楚究竟發生了什麼。例如:沒有配置上游的'git pull'的含義是什麼? (手冊頁僅聲明缺省值爲配置的上游。) – michas 2013-04-03 21:44:35
簡而言之:1.將在沒有當前分支的配置的情況下失敗,否則將與2.使用遠程名稱一樣。 2.將爲給定的遠程使用默認獲取配置(併合並第一個),而在3.中指定要獲取和合並的內容。 4.無效,恕我直言。 (如果有效),將遠程HEAD放入refs/remotes/origin/master併合並。 – andi5 2013-04-03 22:13:45
投票重新打開此問題,因爲不幸的是,它是['site:stackoverflow.com git差異「git pull」「git pull origin master」'](https://www.google.com/search q =站點%3Astackoverflow.com + GIT中+差分+%22git +拉%22 +%22git +拉+原點+主%22)。 – 2014-05-30 13:41:24