Мне никогда не нужно объединять одну удаленную ветку в другую?
На самом деле, вы не можете сделать это. Ну, вы можете, вроде как, но ... ну, это сбивает с толку. Давайте вернемся. : -)
У Git здесь довольно плохая терминология. Слово ответвление неоднозначно. Как только вы привыкнете ко всем его различным значениям, это не так уж плохо: кто-то говорит «работа на ветке X» или «извлечение ветки Y», и мы все знаем, что мы имели в виду, но добраться до этой точки сложно. Подробнее об этом см. Что именно мы подразумеваем под «ветвью»? Но начнем с этого: Git в основном о commits . Названия ветвей появляются позже.
Коммиты и имена ветвей
Самым простым способом, которым Git (и вы) можете найти коммит, является его хеш-идентификатор, который гарантированно уникален для этого конкретного коммита. Но эти хэш-идентификаторы кажутся случайными: 26e47e261
предшествует 8b026edac
, но 1f1cddd55
идет после любого из них, например (это фактические коммиты в Git-репозитории для Git). Имена, такие как имена веток и имена для удаленного отслеживания, позволяют Git - и вы - находите коммиты. Каждое такое имя запоминает ровно один хэш-идентификатор.
Почти каждый коммит также запоминает один или два хеш-идентификатора. Это родительские коммиты этого коммита. Git может связать эти различные хеш-идентификаторы, начиная с того, который хранится в имени и работает в обратном направлении, в цепочки коммитов:
A <-B <-C <--master
Имя master
запоминает хэш-идентификатор коммита C
, который запоминает хэш-идентификатор коммита B
, который запоминает хэш-идентификатор коммита A
. A
- это самый первый коммит (в этом крошечном репозитории только с тремя коммитами), поэтому у него нет родителя и, таким образом, заканчивается цепочка.
Процесс добавления нового коммита состоит из выписывания нового коммита с использованием текущего хеш-идентификатора конца ветки в качестве его родителя и затем name , указывающего на новый коммит :
A--B--C--D <-- master
(Проще не рисовать внутренние стрелки, которые всегда указывают назад по определению и - в отличие от названий ветвей - никогда не могут быть изменены после создания, поэтому я обычно их не рисую.)
Имена удаленного слежения
Когда вы работаете с Git-репозиторием, вы обычно начинаете с получения всех коммитов из какого-либо другого существующего Git-репозитория. other Git использует свои имена ветвей, чтобы найти эти коммиты. Ваш Git собирает эти коммиты, но ваш Git даст вам ваши названия веток, независимо от их. Таким образом, вашему Git нужны некоторые другие имена - имена, которые не являются ответвлениями имен - чтобы найти их коммиты. Вы клонируете их репозиторий, и ваш Git переименовывает их master
в ваше origin/master
- имя удаленного отслеживания или имя удаленного отслеживания ветви , которое некоторые люди называют имя удаленного филиала . 1
После того, как начальный клон, который создает origin/*
, git fetch origin
вызовет тот же URL-адрес (сохраненный после того, как вы сделали клон), чтобы поговорить с тем же Git, собрать с него все новые коммиты, которые он может иметь, и обновите все ваши имена для удаленного отслеживания, чтобы они соответствовали названиям их ветвей. Таким образом, ваши имена для удаленного отслеживания автоматически следуют за их именами ветвей. Это их главная цель: запомнить, какой коммит запоминают их имена ветвей.
1 »Имя удаленной ветви ", вероятно, является наихудшей из всех этих фраз, но ни одна из них не является хорошей, поскольку Git использует слово remote для обозначения имени типа origin
, которое можно использовать для идентификации прочее Git-репозиторий. Так что если бы вы пошли в Git по URL-адресу, указанному в вашем remote.origin.url
, и спросили его о его ветвях, вы бы получили их master
, их develop
и т. Д. Это имена ветвей на удаленном компьютере: имена веток на удаленном компьютере. Каждое из них обязательно должно быть именем удаленной ветви. Но они не входят в ваш Git, у которого вместо этого есть имена, такие как origin/master
и origin/develop
. Я думаю, что origin/master
a имя удаленного слежения является лучшим из этих неоднозначных фраз: это ваш имя для их (origin
s) master
.
Создание имени ветви из другого имени
Последний шаг git clone
обычно git checkout master
. 2 Ваш Git еще не имеет a master
, так что ваш Git проходит через все удаленные отслеживая имена, которые он имеет (он только что их создал) - origin/develop
и origin/master
и т. д. - и находит их origin/master
. Это указывает на какой-то конкретный коммит, поэтому ваш Git теперь создает ваш master
, указывая на тот же коммит:
A--B--C--D <-- master (HEAD), origin/master
\
E <-- origin/develop
Если вы сейчас запустите git checkout develop
, это создаст ваш собственный develop
, указывая на тот же коммит, что и origin/develop
:
A--B--C--D <-- master, origin/master
\
E <-- develop (HEAD), origin/develop
Обратите внимание, что HEAD
прикреплено к одному из имен ваших веток - вот как Git знает, в какой ветке вы находитесь, когда вы делаете новый коммит.
Допустим, вы добавили свой собственный коммит к своему master
, выполнив git checkout master
и выполнив некоторую работу. Это создаст новый коммит с уникальным хеш-идентификатором и заставит master
указать на этот новый коммит:
F <-- master (HEAD)
/
A--B--C--D <-- origin/master
\
E <-- develop, origin/develop
Этот конкретный пример не использует git merge
, который имеет свой собственный набор сложностей (я не хочу вдаваться в подробности здесь), но суть достаточно проста: вы всегда делаете все ваша работа над вашими ветками. Когда вы закончите эту работу, вы можете запустить git push
до:
- отправлять коммиты другим Git, если необходимо; а затем
- попросите, чтобы их Git установили их имя ветви на основе того, что вы только что отправили.
Следовательно, теперь вы можете git push origin master
отправить им свой новый коммит F
и попросить их указать их master
пункт для фиксации F
. Если они согласятся с этим, ваш Git запишет это обновление, так что теперь у вас есть:
F <-- master (HEAD), origin/master
/
A--B--C--D
\
E <-- develop, origin/develop
2 Вы можете указать вашему Git использовать другое имя, и если вы этого не сделаете, другой Git скажет вашему Git, какое имя использовать, но обычно это master
.