Имя ветки Git - чувствительно к регистру или нечувствительно?

Я новый пользователь 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? Неужели этот мерзавец запутался и переименовал мою историческую информацию в ветку, которая похожа и отличается только заглавными буквами?

Пожалуйста, помогите, как я могу это исправить. Спасибо, куча

 jak21 июл. 2016 г., 04:35
Торек - я использую машину Unix для этого
 torek21 июл. 2016 г., 04:26
Вы используете систему Windows?
 VonC28 дек. 2016 г., 21:44
Git 2.12 помогает проиллюстрировать, что имена веток действительно чувствительны к регистру:stackoverflow.com/a/41307509/6309

Ответы на вопрос(2)

git show-branch (как ElpieKayЯ никогда не используюgit show-branch; кажется в основном неинформативным)

Имена веток Git - и имена тегов, и все остальныессылка имена, как их называет Git, были изначальнопредназначена быть чувствительным к регистру.

Все это прекрасно работает на компьютерах с Linux / Unix, где код Git чувствителен к регистру. Когда Git хранит имена веток в файловой системекак имена файлов (что это только делаетиногда), файловая система также чувствительна к регистру.1

Этоиногда не работает в Windows и некоторых системах MacOS. В частности, происходит сбой, когда Git хранит ссылки в отдельных файлах, имена которых получены из имени ссылки, и эти имена файлов не чувствительны к регистру (например, сохраняют регистр, но сбрасывают регистр во время сопоставления имен; или даже преобразуют все в верхний регистр). -только, как в действительно старом формате FAT 8.3, но мы можем надеяться, что ни одна современная файловая система не сделает этого).

Как отмечено выше, Git не всегда хранит ссылочные имена как имена файлов. На самом деле, при первоначальном клонировании все имена находятся в одном файле с именем.git/packed-refs,2 поэтому на данный момент ониявляются с учетом регистра. Но они становятся "распакованы" со временем,3 а затем в некоторых системах они складываются.

Поскольку в некоторых системах иногда происходит сбой, обычно лучше избегать использования нескольких имен ссылок, которые отличаются только регистром.

1Конечно, в современных системах Unix / Linux вы теперь можете получить доступ к файловым системам, сохраняющим регистр, но не чувствительным к регистру, и теперь Windows и MacOS могут запретить компиляцию регистра для некоторых файловых систем. (Но если вы измените настройки по умолчанию, ожидайте, что программное обеспечение, предназначенное для вашего устройства, выйдет из строя, потому что это произойдет. Такие вещи, как Photoshop, внутренне пытаются использовать файлы с именемfoo а такжеFOO и ожидайте, что это будет ссылаться на тот же файл!)

2Этот файл упакованных ссылок существует довольно давно, но не навсегда, и очень ранние версии Git могут его не использовать. Внутри Git приобретает новый «сменный интерфейс имен ссылок», и в будущих версиях Git могут не использоваться ни этот файл, ни отдельные файлы для каждой ссылки.

3Как правило, создание или обновление ссылки приводит к появлению распакованного файла ссылки. Бегgit pack-refs --all заменит распакованные ссылки на упакованные, восстановив полную чувствительность к регистру. Без--all, git pack-refs только упаковывает уже упакованные ссылки, что в значительной степени является бесполезным режимом работы (он был предназначен для случая, который больше не используется).

Решение Вопроса

Вы создали новую веткуDEV когда ты был на веткеdev, ТакDEV а такжеdev две ветви, которые указывают на один и тот же коммит. После того, как вы переименовалиDEV вDV, сейчасDV а такжеdev две ветви, которые указывают на один и тот же коммит.

Все просто отлично. Если не хочешьDV беспокоить вас, вы могли бы просто бежатьgit branch -d DV убрать веткуDV, Если вы действительно хотите создать новую ветку, лучше придерживаться правила именования, которое не может сбить вас с толку и других.

Я никогда не пользоваласьgit show-branch. git log --oneline --all --graph --decorate=full рисует четкую графику журнала.

 ElpieKay21 июл. 2016 г., 05:39
@ Нора, так что вы пропустили некоторые из+ знаки, которые сделали вывод необоснованным.
 ElpieKay21 июл. 2016 г., 05:17
@ Нора и я нашел больше информации. Я думаю, что позиции марки+ в вашем выводе show-branch неправильно. Они должны быть прямо под первым! отметка. И!s имеют разные цвета, если нижняя фиксация достижима из вышеуказанной ветви, есть+ прямо под! которая представляет эту ветвь. Выделенная ветка имеет префикс* вместо.
 jak21 июл. 2016 г., 05:37
извиняюсь, не могу понять, как сделать мой комментарий аккуратным ...
 jak21 июл. 2016 г., 05:44
Да, я опущен. Спасибо за ваш ответ, это решило мой вопрос. Я удалил DV, и теперь он ссылается на PRD.
 jak21 июл. 2016 г., 05:33
спасибо за ваше разъяснение, если я продолжу удалять DV, будут ли также удалены ссылки? а также, ваш второй комментарий, он не выглядит правильным, потому что я беру только часть всего этого, чтобы публиковать здесь. Оригинальная маркировка выглядит как + + + * [DV] Изменения стиля + + + * [DV ^] SMS 5.4 + + + * [DV ~ 2] Изменение логотипа + + + * [DV ~ 3] SMS 5.3 + + + * [DV ~ 4] SMS 5.2
 ElpieKay21 июл. 2016 г., 05:37
@Nora DV является одной из ссылок. Это переменная, которая хранит коммит sha1 или другую ссылку, на которую он указывает. Удаление не приведет к потере истории коммитов.
 ElpieKay21 июл. 2016 г., 05:05
@ Нора Я сделал несколько тестов и нашел правило. Часть над--------, ветви сортируются по некоторому порядку. Еслиgit show-branch без какой-либо опции, это алфавитный порядок. Часть под---------Если некоторые ветви указывают на один и тот же коммит, первый из них будет указан как делегат. DEV предшествует TST и PRD, так что это их делегат.
 jak21 июл. 2016 г., 04:57
Я надеюсь, что это так. Но чтобы уточнить, после того, как я создал DEV, я также создал две другие ветки, называемые TST и PRD, пока я нахожусь в ветке dev. Так что эти двое также будут указывать на один и тот же коммит. Но почему ссылка меняется только при создании ветки DEV?

Ваш ответ на вопрос