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

Git branch name - case sensitive or insensitive?

我是一个新 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 分支 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”分支期间旧工作的描述。

我正在尝试 return 通过将 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 是否混淆了我的历史信息并用一个相似但仅大写不同的分支重命名?

请帮助我解决这个问题。谢谢堆

So I went ahead and create new branch (git branch DEV)

您在分支 dev 上创建了一个新分支 DEV。所以 DEVdev 是指向同一个提交的两个分支。将 DEV 重命名为 DV 后,现在 DVdev 是指向同一个提交的两个分支。

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

我没用过git show-branchgit log --oneline --all --graph --decorate=full 绘制清晰的对数图。

只回答主题行中的问题,没有解决任何关于 git show-branch 的问题(,我从未真正使用过 git show-branch;这似乎主要是错误的信息):

Git 分支名称和标签名称,以及所有其他 reference 名称,Git 称它们为最初 区分大小写。

这一切都在 Linux / Unix 机器上完美运行,其中 Git 的代码开始时区分大小写。当 Git 将文件系统 中的分支名称存储为文件名 (它只是 有时 ),文件系统也是大小写-敏感.1

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

如上所述,Git 并不总是将参考名称存储为文件名。事实上,在初始克隆中,所有名称都在一个名为 .git/packed-refs2 的文件中,因此此时它们 大小写敏感的。但随着时间的推移,它们会变成 "unpacked",3,然后在某些系统上它们会变成大小写折叠。

因为它有时在某些系统上会失败,所以通常最好避免使用仅大小写不同的多个引用名称。


1当然,在现代 Unix/Linux 系统上,您现在可以访问保留大小写但不区分大小写的文件系统,并且 Windows 并且 MacOS 现在可以被告知不要对某些文件系统进行大小写折叠。 (但是,如果您更改默认设置,则预计专为您的盒子设计的软件会失败,因为它会。像 Photoshop 之类的东西在内部尝试使用名为 fooFOO 的文件,并期望它指的是同一个文件!)

2这个打包引用文件已经存在了很长一段时间,但不会永远存在,Git 的早期版本可能不会使用它。在内部,Git 正在获取一个新的 "pluggable reference name interface",Git 的未来版本可能既不使用此文件,也不使用单独的参考文件。

3通常,创建或更新引用会导致解压缩的引用文件出现。 运行 git pack-refs --all 将用压缩引用替换未压缩引用,恢复完全区分大小写。没有--allgit pack-refs只打包已经打包的引用,这在很大程度上是一种无用的操作方式(它是为不再使用的情况而设计的)。