Git分支名称 - 区分大小写还是不区分大小写?

40

我是一个新的git用户,最近被交付管理一个过时的git代码库。

这是最初的状态(由git show-branch输出):

! [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~2等)。
为了开发目的,我试图创建一个名为“DEV”的分支,全部使用大写字母。
所以我继续创建了一个新分支(git branch DEV),现在正在运行git show-branch --date-order命令:
! [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都被列为分支。同时请注意,第5行对dev的引用现在已更改为DEV(即DEV、DEV^、DEV~2等)。

第5行输出指的是什么?我原本期望它仍然是“dev”,而不是被修改为“DEV”,因为旁边的描述是关于“dev”分支的旧工作的描述。

我正在尝试通过修改DEV分支名称为DV(运行git branch -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。同时,请注意第5行中对dev的引用现在已更改为DV(即DV、DV^、DV~2等)。

有没有办法回到最初状态,以恢复关于DV的引用?Git是否混淆了我的历史信息,并将其重命名为类似但只有大小写不同的分支?

请协助我解决此问题。非常感谢。


你是否使用的是Windows系统? - torek
torek - 我用Unix机器来做这个。 - jak
Git 2.12帮助说明分支名称确实区分大小写:https://dev59.com/cIPba4cB1Zd3GeqPxMxK#41307509 - VonC
2个回答

73

只回答主题中的问题,而不涉及有关 git show-branch 的任何内容(像ElpieKay一样,我从未实际使用 git show-branch;它似乎主要是误导性的):

Git 分支名称和标签名称以及所有其他 Git 称之为“引用”的名称最初都是区分大小写的。

这在 Linux / Unix 机器上完全可以正常工作,因为 Git 的代码本来就区分大小写。当 Git 将分支名称存储在文件系统中的时候,它也将其存储为文件名(仅在某些情况下),而文件系统也是区分大小写的。1

但在 Windows 和某些 MacOS 系统上,它有时会失败。具体来说,当 Git 将引用存储在单独的文件中时,这些文件的名称派生自引用名称,并且这些文件名不区分大小写(例如,在匹配名称时保留大小写,但折叠大小写;或者甚至将所有内容转换为仅大写字母,就像旧的 FAT 8.3 格式一样,但我们可以希望现代文件系统不会这样做)。

如上所述,Git并不总是将引用名称存储为文件名。事实上,在初始克隆时,所有名称都在一个名为.git/packed-refs的单个文件中,因此此时它们是区分大小写的。但它们随着时间的推移而“解压缩”,然后在某些系统上变成了大小写折叠。
因为它有时会在某些系统上失败,所以最好避免使用仅在大小写上有区别的多个引用名称。

1当然,在现代Unix/Linux系统上,您现在可以访问保留大小写但不区分大小写的文件系统,Windows和MacOS现在也可以告诉某些文件系统不要进行大小写折叠。(但是,如果更改默认设置,请期望针对您的计算机设计的软件将失败,因为它会。像Photoshop这样的软件内部尝试使用名为fooFOO的文件,并期望这指的是同一个文件!)

2这个压缩引用文件已经存在了很长时间,但并非永远存在,早期版本的Git可能不使用它。在内部,Git正在获取一个新的“可插拔引用名称接口”,未来版本的Git可能既不使用此文件,也不使用单独的每个引用文件。

3通常,创建或更新引用会导致未打包的引用文件出现。运行git pack-refs --all将使用打包的引用替换未打包的引用,恢复完全的大小写敏感性。没有--allgit pack-refs仅打包已经打包的引用,这基本上是一种无用的操作模式(它是为一个不再使用的情况而设计的)。


6
需要有人创建一个新问题,这样我们才能将Torek的答案附加到新问题上,并将其设为被接受的答案。这个答案迫切需要更广泛的曝光。特别是关于Git在仓库的生命周期内不一致地处理pack-refs和分支名称的部分。 - Chris Quenelle

15

所以我创建了一个新的分支(git branch DEV)

当你在分支dev上时,你创建了一个新分支DEV。因此DEVdev是指向相同提交的两个分支。之后你将DEV重命名为DV,现在DVdev是指向相同提交的两个分支。

一切都很好。如果你不想让DV打扰你,可以运行git branch -d DV将其删除。如果你确实想创建一个新的分支,最好遵循一些命名规则,这样你和其他人就不会混淆。

我从来没有使用过git show-branchgit log --oneline --all --graph --decorate=full绘制了清晰的日志图形。


@Nora 我进行了一些测试并找到了规则。在--------上面的部分,分支按某种顺序排序。如果没有任何选项的git show-branch,则是按字母顺序排列的。在---------下面的部分,如果某些分支指向相同的提交,则它们中的第一个被列为代表。DEV在TST和PRD之前,因此它是它们的代表。 - ElpieKay
@Nora和我找到了更多信息。我猜你的show-branch输出中+标记的位置是错误的。它们应该位于第一个!标记的正下方。如果下面的提交可以从上面的分支到达,则!具有不同的颜色,表示该分支下面有一个+。选中的分支前缀为* - ElpieKay
谢谢您的解释,如果我继续删除DV,是否也会删除相关引用?另外,关于您的第二个评论,它似乎不正确,因为我只把整个东西的一部分发布在这里。原始标记看起来像: + + + * [DV] 样式更改 + + + * [DV^] 短信5.4 + + + * [DV2] Logo更改 + + + * [DV3] 短信5.3 + + + * [DV~4] 短信5.2 - jak
@Nora DV 是其中一个引用。它是存储提交 sha1 或其它指向该引用的变量。删除它不会丢失任何提交历史。 - ElpieKay
谢谢您的回答,解决了我的问题。我已经删除了DV,现在它正在引用PRD。 - jak
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接