2016-07-21 202 views
9

我是一個新的git用戶,最近被交給一個過期的git倉庫來照顧。Git分支名稱 - 區分大小寫還是不敏感?

這是原來的狀態(輸出由混帳顯示分支):

! [cr232] CR 232 Release 
     * [dev] Style Changes 
--------------- 
     * [dev] Style Changes 
     * [dev^] SMS 5.4 
     * [dev~2] Logo Change 
     * [dev~3] SMS 5.3 
     * [dev~4] SMS 5.2 
     * [dev~5] SIT R-0.3.3 EDW SMS Layers 
     * [dev~6] SIT Release R 0.3.0 
     +* [cr232] CR 232 Release 
     +* [cr232^] Dashboard Fix 
     +* [cr232~2] Release for system testing 

注意,有一個名爲「開發」在這一點上分支。請注意,突出顯示有幾個對dev的引用(即dev,dev ^,dev〜2等)。

爲了我的發展目的,我試圖想出一個名爲'DEV'的分支,所有的首都。

所以我繼續創造新的分支(GIT分支DEV),現在運行git秀分支-date順序:

! [DEV] Style Changes 
    ! [cr232] CR 232 Release 
     * [dev] Style Changes 
--------------- 
     * [DEV] Style Changes 
     * [DEV^] SMS 5.4 
     * [DEV~2] Logo Change 
     * [DEV~3] SMS 5.3 
     * [DEV~4] SMS 5.2 
     * [DEV~5] SIT R-0.3.3 EDW SMS Layers 
     * [DEV~6] SIT Release R 0.3.0 
     +* [cr232] CR 232 Release 
     +* [cr232^] Dashboard Fix 
     +* [cr232~2] Release for system testing 

請注意這兩個開發和DEV被列爲分支。還要注意的是,在第五行上,對dev的引用現在已經變成DEV(即,DEV,DEV ^,DEV〜2等)。

第5行輸出是指什麼?我期望它保持「開發」而不是被改爲「DEV」,因爲它旁邊的描述指的是在「dev」分支期間舊作品的描述。

我試圖返回到它是如何通過修改Dev分支名DV(運行git分支-m DEV DV),並顯示該分支現在的樣子:

! [DV] Style Changes 
    ! [cr232] CR 232 Release 
     * [dev] Style Changes 
--------------- 
     * [DV] Style Changes 
     * [DV^] SMS 5.4 
     * [DV~2] Logo Change 
     * [DV~3] SMS 5.3 
     * [DV~4] SMS 5.2 
     * [DV~5] SIT R-0.3.3 EDW SMS Layers 
     * [DV~6] SIT Release R 0.3.0 
     +* [cr232] CR 232 Release 
     +* [cr232^] Dashboard Fix 
     +* [cr232~2] Release for system testing 

注意,分支現在包括DV和dev。還要注意,第五行對dev的引用現在已經改變爲DV(即DV,DV ^,DV〜2等)。

有沒有什麼辦法可以回到原始狀態的DV參考? git是否被混淆並將我的歷史信息重新命名爲一個類似的分支,並且只因大寫而不同?

請協助我如何解決這個問題。感謝堆

+0

您使用的是Windows系統嗎? – torek

+0

託雷克 - 我使用的Unix機器此 – jak

+0

Git的2.12有助於說明該分支的名稱確實是大小寫敏感的:http://stackoverflow.com/a/41307509/6309 – VonC

回答

3

所以我繼續創造新的分支(GIT分支DEV)

您創建了一個新的分支DEV當你的分支dev。所以DEVdev是指向相同提交的兩個分支。在將DEV重命名爲DV後,現在的DVdev是指向相同提交的兩個分支。

一切都很好。如果你不想DV打擾你,你可以運行git branch -d DV刪除分支DV。如果你確實想創建一個新的分支,最好遵循一些不會讓你和其他人混淆的命名規則。

我從來沒有使用git show-branchgit log --oneline --all --graph --decorate=full繪製清晰的日誌圖形。

+0

我希望是這樣。但僅僅爲了澄清,在我創建DEV之後,我還在開發分支上創建了另外兩個名爲TST和PRD的分支。所以這兩個也會指向同樣的提交。但是爲什麼只有在創建DEV分支時引用纔會變化? – jak

+0

@Nora我做了一些測試並找到了規則。在'--------'上面的部分,分支按照某種順序排序。如果'git show-branch'沒有任何選項,那就是字母順序。 '---------'下面的部分,如果某些分支指向相同的提交,它們中的第一個被列爲委託。 DEV在TST和PRD之前,因此它是他們的代表。 – ElpieKay

+0

@Nora,我發現更多信息。我猜你的show-branch輸出中標記「+」的位置是錯誤的。它們應該在第一個'!'標記下面。 '!'有不同的顏色,如果下面的提交可以從上面的分支中得到,那麼表示該分支的'!'下面有一個'+'。檢出的分支以「*」作爲前綴。 – ElpieKay

21

回答只是在主題行的問題,如果不解決約git show-branch任何東西(like ElpieKay,我從來沒有真正使用git show-branch;它似乎主要錯誤信息):

的Git分支名稱和標籤名稱,和所有其他參考名稱,因爲Git稱他們 - 原本是打算區分大小寫。

這一切都可以在Linux/Unix機器上完美工作,其中Git的代碼首先區分大小寫。當Git將文件系統中的分支名稱作爲文件名(它只有有時)存儲時,文件系統也區分大小寫。

有時在Windows和某些MacOS系統上失敗。具體來說,當Git將引用存儲在單個文件中時,它失敗了,這些文件的名稱是從引用名派生的,而這些文件名是不區分大小寫的(例如,保留大小寫,但在名稱匹配期間摺疊大小寫;甚至將所有內容都轉換爲大寫 - 只有在真正的舊式FAT 8.3格式中,我們才能希望現代文件系統無法做到這一點)。

如上所述,Git並不總是將引用名稱存儲爲文件名。實際上,在初始克隆中,所有名稱都在一個單獨的文件中,稱爲.git/packed-refs,,因此此時它們均爲區分大小寫。但隨着時間的推移,它們變得「解壓縮」,然後在某些系統上它們變成了案例摺疊。

因爲它在某些系統上有時會失敗,所以通常最好避免使用僅在大小寫不同的多個引用名稱。


當然,在現代Unix/Linux系統,你可以現在可以訪問的情況下保留,但是,不區分大小寫的文件系統,以及Windows和現在的MacOS可以告訴不要做案例 - 爲某些文件系統摺疊。 (但如果你從默認值改變,預計是爲你的機器出現故障,因爲它會。像Photoshop的東西在內部嘗試使用名爲fooFOO文件,並期望這將指向同一個文件的軟件!)

這個打包引用文件已經存在了很長一段時間,但並不是永遠的,Git的早期版本可能不會使用它。在內部,Git正在獲取一個新的「可插入參考名稱界面」,未來版本的Git可能不會使用此文件,也不會使用單個的每個參考文件。

通常,創建或更新引用會導致解壓縮的引用文件生成。正在運行git pack-refs --all將用壓縮引用替換未壓縮的引用,恢復全部區分大小寫。如果沒有--allgit pack-refs只打包已經打包的引用,這在很大程度上是無用的操作模式(它是針對不再使用的情況)。

+2

感謝torek非常翔實 – jak