2013-04-03 45 views
58

這些是什麼命令之間的差異?:當從原點拉動時,「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 
+0

那麼,即使在閱讀手冊頁後,並不是所有情況下都清楚究竟發生了什麼。例如:沒有配置上游的'git pull'的含義是什麼? (手冊頁僅聲明缺省值爲配置的上游。) – michas 2013-04-03 21:44:35

+0

簡而言之:1.將在沒有當前分支的配置的情況下失敗,否則將與2.使用遠程名稱一樣。 2.將爲給定的遠程使用默認獲取配置(併合並第一個),而在3.中指定要獲取和合並的內容。 4.無效,恕我直言。 (如果有效),將遠程HEAD放入refs/remotes/origin/master併合並。 – andi5 2013-04-03 22:13:45

+2

投票重新打開此問題,因爲不幸的是,它是['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

回答

61

git pull是一個方便的命令,這是在同一時間做不同的事情。基本上,它只是git fetch(它連接到遠程存儲庫並獲取新提交)和git merge(或git rebase)的組合,它將新提交合併到本地分支中。由於涉及兩個不同的命令,所以git pull的含義並不總是顯而易見的。

您可以爲本地分支配置上游。新鮮克隆後,您將有一個本地分支「主」,一個遠程「起源」,您的主分支具有「起源/主」作爲上游。 我假設下面這個設置。 (你可以看到你的上游配置有git branch -vv或通過查看的.git /配置)。

現在對於你的問題:

  1. git pull = git fetch origin + git merge origin/master(或任何你的上游)
  2. git pull origin = git pull(只要原點是您的上游遠程)
  3. git pull origin master = git fetch origin master + git merge FETCH_HEAD
  4. git pull origin/master:除非你有一個名爲「origin/master」的遠程設備,否則無效。
  5. git pull origin HEAD:master:嘗試直接將本地主設備重置爲任何HEAD指向原點的設備。 (別這樣做。)
+1

爲什麼執行'git pull origin HEAD:master'是一個壞主意? – 2013-04-03 22:49:18

+2

右側應該是一個遠程分支。請參閱手冊頁中的警告。如果你使用這個,確保你知道你在做什麼。 – michas 2013-04-03 23:06:05

+0

如果我在其他分支會'git pull'拉那個分支或者主人 – aWebDeveloper 2014-02-07 09:37:12

13

一個pull基本上是一個fetch(後者從遠程倉庫到你的一些提交和相關對象),然後其中「適用」的操作到這些工作拷貝。第二階段默認情況下是使用merge完成的,但您可以將pull.rebase變量設置爲true,然後它將改爲rebase。

命令pull彈出兩個問題。首先是,究竟獲取了什麼?第二個是,它如何將這些更改應用於我的工作副本?我們從第一個開始。該命令的完整形式是

git pull [options] [repository] [<refspec>...] 

options是控制行爲的標誌(例如--rebase使pull工作作爲fetch + rebase即使pull.rebasefalse)。

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

相關問題