Для Git важны коммиты .
Чтобы действительно понять, что происходит, держите эти две идеи отдельно в своей голове:
- У коммитов есть хэш-идентификаторы, например
b7bd9486b055c3f967a870311e704e3bb0654e4f
.
- Ветвь Имена как
master
просто хранить один идентификатор хеша фиксации.
истинное имя любого коммита - это его необработанный хэш-идентификатор. Если у I есть коммит b7b<blah>
, а у у вас есть коммит b7b<blah>
(для того же ), мы имеем тот же коммит . Неважно, какое имя ветви или имена, которые мы используем для него, при условии, что ID совпадает.
Когда вы удаляете имя ветки в вашем Git, это почти все, что происходит: вы удалили name mass-communication-rm
, которое ваш Git использовал для запоминания какого-то большого уродливого хеш-идентификатора. Давайте использовать буквы MCR для обозначения хэш-идентификатора. Поскольку вы успешно выполнили git push
ранее, вы отправили коммит с идентификатором MCR в другой Git-репозиторий, и этот другой Git-репозиторий теперь имеет его. Пока они все еще имеют коммит MCR , вы всегда можете вызвать этот репозиторий Git и получить его обратно.
Теперь, когда вы дали им - Git на GitHub - коммит MCR , вы называли его mass-communication-rm
. Вы, вероятно, сказали им назвать это mass-communication-rm
. Помните, что их Git похож на ваш Git: у него свои имена веток. Как и в вашем Git, каждое из их имен ветвей запоминает один большой уродливый хэш-идентификатор.
Ваш Git также помнит, что его Git существует и имеет URL-адрес, который хранит ваш Git под удаленным именем origin
. Ваш собственный Git запомнит их имен веток под вашими именами Git origin/*
, которые ваш Git называет именами удаленного слежения . Это означает, что ваш Git имеет имя origin/mass-communication-rm
, которое запоминает хеш-идентификатор коммита MCR ... поэтому ваш Git также все еще имеет имя для этого большого безобразного хеш-идентификатора!
Давайте рассмотрим:
- Ваш Git запоминает URL своего Git через короткое имя
origin
(которое ваш Git называет remote ).
- Вы дали им - GIt на GitHub, по этому URL - зафиксировали MCR и сказали им оставить его под своим именем
mass-communication-rm
.
- Итак, ваш Git имеет
origin/mass-communication-rm
, который запоминает большой некрасивый хеш-идентификатор для коммита MCR .
Если вы запустите git branch -r
(для получения списка имен удаленного отслеживания) или git branch -a
(для отображения имен локальных филиалов и имен для удаленного отслеживания), вы увидите, что ваше mass-communication-rm
ушел, но origin/mass-communication-rm
все еще там. 1
Это, в свою очередь, означает, что вы можете запустить:
$ git checkout mass-communication-rm
до пересоздать ваше собственное локальное mass-communication-rm
имя на основе origin/mass-communication-rm
. То есть ваш Git создаст новое имя локальной ветки и добавит в это имя большой уродливый хеш-идентификатор, который ваш Git запоминает под именем origin/mass-communication-rm
.
Затем вы можете добавлять новые коммиты. Добавление нового коммита в ветвь состоит из создания нового коммита (обычным способом), а затем наличия собственного Git-набора вашего имени ветки для запоминания нового уникального большого ugly-hash-ID, который ваш Git генерирует для этого нового коммита. Сам новый коммит запоминает предыдущий хэш-идентификатор; Ваше собственное имя ветки запоминает новый идентификатор, и ваш Git находит старый коммит - тот, который мы здесь называем MCR - путем поиска в обратном направлении из новый коммит.
Более подробно об этом, в том числе о другой роли, которую играют имена ветвей в поддержании коммитов "живыми", см. Думай как (а) Git .
1 Обратите внимание, что git branch -r
печатает origin/mass-communication-rm
, но git branch -a
печатает remotes/origin/mass-communication-rm
. полное имя refs/remotes/origin/mass-communication-rm
. Полное название вашей собственной ветки: refs/heads/mass-communication-rm
.
Git normally удаляет части refs/
и heads/
или remotes/
этих имен, поскольку они не очень полезны. По какой-то неизвестной причине git branch -a
не снимает часть remotes/
, в то время как git branch -r
делает.