2015-03-13 111 views
6

雖然在特性分支工作,我用這個混帳命令來更新我的「開發」分支到最新狀態,立即合併我的特性分支與「發展」之前:爲什麼「git fetch origin branch:branch」僅適用於非當前分支?

git fetch origin develop:develop 

這工作,即當地的「發展」點與「原產地/發展中國家」具有相同的承諾,並且處於最新的起源狀態。

但不知何故,此命令時,「開發」分支簽出失敗:

fatal: Refusing to fetch into current branch refs/heads/develop of non-bare repository 
fatal: The remote end hung up unexpectedly 

這將幫助我理解Git的更好,如果我知道爲什麼會發生如此。

回答

7

錯誤消息來自builtin/fetch.c#check_not_current_branch()
該函數去所有的方式回到commit 8ee5d73, Oct. 2008, git 1.6.0.4

的評論是有啓發:

一些容易混淆的教程建議,這將是獲取 進當前的分支像這樣的東西是一個好主意:

git fetch origin master:master 

(或者更糟:與 「拉」 inste相同的命令行「取」的廣告)。
儘管存儲要提取的內容可能有意義,但當前分支爲「master」時,通常顯示爲 明顯錯誤。
只有當(錯誤的)「git pull origin master:master」試圖通過將--update-head-ok提供給底層的「git fetch」時,才應該允許這樣做,否則我們應該拒絕它,但在某些地方我們會丟失該行爲。

當前分支的檢查現在僅在非裸 庫,這是從原來的行爲的改善進行

考慮到功能check_not_current_branch()called with

if (!update_head_ok) 
     check_not_current_branch(ref_map); 

這意味着git fetch -u origin develop:develop應該工作。

-u 
--update-head-ok 

默認的git獲取拒絕更新對應於當前分支的頭。此標誌禁用檢查。
這是純粹的內部使用git pull溝通git fetch,除非你正在實施自己的瓷器,你不應該使用它。

即使你不應該使用該選項,它回答您的初始需求,使得在當前分支git fetch origin branch:branch」的工作。


關於這個補丁的來源,follow the discussion there

雖然它可能是有意義的存儲你想拉

這是fetch部分是什麼:它存儲從更新origin/master遠程歷史。
但是,噹噹地的本地分支也是master時,這個問題尤其突出。
如前所述in this answer

我覺得「git fetch url side:master」當master是當前分支 和我們省略--update-head-ok壞了。
當前master測試失敗。

它也無法更新工作目錄,並將 索引留下,就像刪除所有內容一樣。

+0

你可以更清楚_why_ git默認情況下可以防止'git fetch origin master:master'嗎?我覺得理解這個問題的關鍵可能在於此引用,但含義並不明確: _「儘管存儲要提取的內容可能有意義,但當前分支爲' master'。「_ 作者所說的」存儲你想要拉什麼「是什麼意思? – sleeparrow 2017-07-25 15:00:01

+0

@sleeparrow我不得不回到這個補丁的原始線程:https://www.spinics.net/lists/git/msg82242.html。我已經更新了答案。 – VonC 2017-07-25 15:21:22

1

git fetch只能從遠程回購

  1. 它不更新你的地方分支機構獲取數據,甚至the're成立跟蹤遠程那些
  2. (因爲1)它不能遠程讀取分成當地的一個。這只是不是git fetch

根據man

混帳取[<選項>] [<庫> [<的Refspec> ...]]

你可以像git fetch origin develop一樣運行,它只會更新遠程分支origin/develop

爲了更新你的本地分支,你可以在一個方式做了以下幾點:

  1. 明確指定哪些遠程分支應該被拉到什麼地方分支:git pull origin develop:develop
  2. 如果develop分公司簽出現在,它是建立跟蹤origin/develop你可能只是運行git pull,它會找出拉什麼

更新

從人更多:

當GIT中提取所運行具有明確的分支和/或標籤上 命令行來獲取,例如git fetch origin master,在命令行上給出 確定要獲取什麼(例如,主機在 中的示例,這對於主機來說是一個短暫的手段,而這又意味着 「獲取主分支,但是我沒有明確說明什麼 遠程跟蹤分支從它更新與命令行「)和 示例命令將只提取主分支。 remote..fetch值確定哪個遠程跟蹤 分支(如果有的話)被更新。當以這種方式使用時, remote..fetch值在確定 獲取的內容時沒有任何影響(即,當 命令行列出refspecs時,這些值不會用作refspecs);它們僅用於通過充當映射來決定被提取的參考文件的存儲位置。

可以更新本地分支機構,但我仍然不明白爲什麼在你想要更新的分支上不可能做到這一點。

+1

「它不能獲取遠程分支到本地」 - 但它!看到我更新的問題。它的工作,條件是當地的「發展」沒有簽出。 – MaDa 2015-03-13 13:03:15

+0

@MaDa,你說得對。我錯過了這個......現在我也感到困惑:) – 2015-03-13 13:16:42

相關問題