2014-10-02 27 views
0

當我使用Git,我碰到這個錯誤:如何處理Git中的相同提交?

錯誤解析修訂:e4fff73d6f29a243af63ef0a1a2bff1054d1d2ca警告refname「發展」不明確。

我用命令git show-ref給了我一個倉庫提交列表。我發現我有這個:

e4fff73d6f29a243af63ef0a1a2bff1054d1d2ca refs/tags/develop 
e4fff73d6f29a243af63ef0a1a2bff1054d1d2ca refs/tags/origin 

看來,我確實有兩個提交相同的散列。另外,爲了增加混淆,在當前Git存儲庫中有一個分支叫做開發

我的問題是這樣的:

如何要麼撤併,刪除或只是簡單的解決這個問題,使我不再讓Git來警告我曖昧的參考?

+1

你列出的這兩項是標籤,不應相互衝突。您可以在單次提交中擁有儘可能多的標籤。你是否也有一個名爲develop的分支?我想知道它是否在分支和標籤之間混淆。 – 2014-10-02 15:06:28

+0

@Dave - 是的,還有一個叫做develop的分支。 – Chris 2014-10-02 15:26:04

+0

'develop'分支和標籤已經公開了嗎?如果其中一個不是,只需重命名它;這應該消除Git抱怨的含糊之處。 – Jubobs 2014-10-02 16:10:50

回答

3

正如註釋中指出的那樣,只有一個提交了該ID;但是這個提交有多個名字(這是允許的,在某些情況下甚至是正常的,儘管不是這個特定的名字)。

錯誤消息似乎來自gitk(這是唯一的一塊git源,其中的文字字符串Error parsing revisions:),如果是這樣,是由於警告消息 - gitk假定任何警告消息必須是實際錯誤,即使這只是一個警告。

的關鍵警告是在這裏:

just to add to the confusion, there is a branch which is called develop ...

這意味着縵名develop可能意味着無論是標籤develop,或分支develop。 Git警告你,你會得到一個,而你可能意味着另一個。根據the gitrevisions documentation,在這種特殊情況下,您可以獲得標籤(但是,對於明確的git checkout命令而言,這是不正確的 - 出於正當理由,它有自己的不同規則來決定是否將名稱視爲分支名稱)。

治療警告很簡單:決定是否應該是標記(如果是,重命名或刪除分支名稱)或分支(如果是,重命名或刪除標記名稱)。最有可能的是,分支名稱是正確的,標籤是錯誤的,所以「只是」重命名或刪除標籤。

固化改變標籤名稱的問題是git通常假定標籤名稱是永久性的和全局性的。如果您使用的是共享存儲庫,則可能會從其他人那裏獲取標籤名稱。如果您重新命名或刪除標籤,您可能會再次從標籤中撿起標籤,如某種觸摸傳播的疾病。要正確解決它,您必須「治癒」您自己的存儲庫任何存儲庫您fetch從。如果這是一箇中央服務器存儲庫,其他人使用fetchpush操作,那麼您可能必須先解決這個問題,如果它提取並向其他開發人員分配「疾病」,則可能需要讓他們「修復」其存儲庫。

這到底是什麼歸結爲是一種廣播電子郵件給所有開發者:「哎呀,對不起,在倉庫壞標籤,請重命名或刪除」(也許修復它的服務器上井,有人有修復在那裏,但那可能是有更好訪問權限的人,甚至可能會預先接收或更新鉤子以拒絕嘗試「重新感染」服務器)。


詞 「必須」 還算是有點太強大了。除非您通過例如git fetch --tags或查看您的.git/config文件告訴Git,否則Git將不會獲取所有標籤。默認情況下,它會在標籤指向的提交同時帶來一個標籤。所以只要你已經有648cc593ebe85617cc7dda6b0c126dbbf020a230,你的git不會覺得需要重新創建標籤develop。同樣,除非有指示,否則git push將不會推送標籤。

儘管如此,如果有一個虛假的標籤,那麼很可能是別人也這樣做,除非你是首先創建它的人。因此,就某些疾病而言,跟隨您的合作伙伴往往是明智的。

+0

最後我不得不做git tag -d開發和git push origin:refs/tags/develop在幾個不同的地方。一旦這些命令執行完畢,事情似乎恢復正常。感謝您解釋我的回購內容。 – Chris 2014-10-03 14:02:13