2012-07-13 145 views
7

我有一個本地存儲庫,從遠程存儲庫中提取。運行git pull以及用於執行完全相同的動作git fetch; git merge FETCH_HEAD,如從description of git pull預期:FETCH_HEAD引用在「git fetch」後沒有正確更新

說明

集成了從遠程倉庫變爲當前分支。在默認模式下,git pull是git fetch的縮寫,然後是git merge FETCH_HEAD。

目前,和出乎意料的是,運行git fetch停止正常更新FETCH_HEAD參考。 FETCH_HEAD現在堅持一箇舊的提交。運行git fetch將所有更改下載到遠程跟蹤分支,但FETCH_HEAD保持不變,無論其運行的分支如何。

# currently in branchone 
> git fetch 

# branchone is up to date since... 
> git rev-parse branchone 
593539e8a98ba5980d4b645db3b0f506bb9b6a2c 

# ...its in the same commit as the remote branch 
> git rev-parse origin/branchone 
593539e8a98ba5980d4b645db3b0f506bb9b6a2c 

# however FETCH_HEAD shows something different 
> git rev-parse FETCH_HEAD 
37301df96597ac037f8e7e846fea6fc7df77bea5 

git pull仍然執行正確的任務。然而,運行git fetch; git merge FETCH_HEAD將會有所不同,因爲FETCH_HEAD指向不正確的提交。

是否有任何設置或問題可能與git fetch行爲有關?

回答

7

正在運行git fetch沒有任何選項將取回遙控器中的所有參考,並將它們寫入.git/FETCH_HEAD文件。該文件的內容usualy看起來是這樣的:

37301df96597ac037f8e7e846fea6fc7df77bea5 branch 'master' of github.com:user/repo 
593539e8a98ba5980d4b645db3b0f506bb9b6a2c not-for-merge branch 'branchOne' of github.com:user/repo 

當你有這樣的文件.git目錄下,你可以只要在該文件中的第一件事,要麼是40用它作爲參考字符十六進制數字或實際與現有提交匹配的較短十六進制數字。

# This file can be used as a reference 
> cat .git/MAGIC_HEAD 
deadbeefdeadbeefdeadbeefdeadbeefdeadbeef lorem ipsum 
the rest does not really matter 
refrigerator 

# And thus it will be interpreted by many git commands like this 
> git rev-parse MAGIC_HEAD 
deadbeefdeadbeefdeadbeefdeadbeefdeadbeef 

知道了這一點,我們可以看到,運行git fetch後的參考FETCH_HEAD將解決的就是無論發生什麼事要在第一線

# Assuming the already mentioned contents of .git/FETCH_HEAD 
> git rev-parse FETCH_HEAD 
37301df96597ac037f8e7e846fea6fc7df77bea5 

好像的.git/FETCH_HEAD內容不保證順序首先包含當前分支的引用。

通過在不同的存儲庫中嘗試它,似乎在某些第一行總是當前分支,因此git fetch; git merge FETCH_HEAD按預期工作。但是,在其他存儲庫中,.git/FETCH_HEAD的內容將按不同順序排列,並且通常第一行將是對不同分支的遠程提交的引用,從而導致FETCH_HEAD引用不正確。

爲什麼它的行爲不同對我來說是個謎。

作爲一種解決方案,如果git fetch remote_name branch_name僅使用此特定分支被取出並且只有單線會出現在.git/FETCH_HEAD內容,使得FETCH_HEAD參考總是正確的。

# Will only fetch branchone 
> git fetch origin branchone 

# FETCH_HEAD will contain only a single line 
> cat .git/FETCH_HEAD 
593539e8a98ba5980d4b645db3b0f506bb9b6a2c branch 'branchOne' of github.com:user/repo 
0

試着強迫你的頭指向已完成的最新提交/推送。

你的Git倉庫使用此:

git reset --hard [email protected]{1} 

希望這能解決你的問題,採取這一個點,它使用完全像以前那樣工作。

+0

可悲的是沒有。即使正在重置庫到很老版本的修改沒有在'git fetch'和'FETCH_HEAD'的行爲 – LopSae 2012-07-16 19:24:28

+0

你可以嘗試的另一件事是刪除整個本地存儲庫並再次克隆它,如果沒有,我會進一步幫助你。本地存儲庫.. – aliasgar 2012-07-17 06:34:31

+0

在一個新的版本庫中,行爲是一樣的,'FETCH_HEAD'指向的是第一個出現在'.git/FETCH_HEAD'文件中的文件。讀取它看起來像這是預期的行爲,但我仍然懷疑wh你之前在做'git fetch; git merge FETCH_HEAD'可以在任何分支上完美工作。 – LopSae 2012-07-24 02:02:45

0

在運行git fetch(不帶參數),FETCH_HEAD將只包括適用於合併基準(即未標記爲不換合併)如果當前的本地分支(即HEAD)是一種跟蹤分支。

的解決方案是使當前分支跟蹤分支(見How do you make an existing Git branch track a remote branch?)或指定的遠程和分支來獲取(即git fetch origin branch

+0

我正在研究的分支中,所有分支已經跟蹤遠程分支。在您再次引起我的注意這個問題後,我重新編寫了我的答案,以更好地解釋爲什麼'FETCH_HEAD'引用無法正確更新。也許它與你提到的有一些相關性,'.git/FETCH_HEAD'中的第一行只有在我沒有意識到的其他情況下才能保證。 – LopSae 2014-04-11 04:10:06