Команда git pull
, которую использовал хотя бы один из вас двоих, запускает для вас две другие команды Git. (Я буду ссылаться здесь на «вы», но это может быть другой инженер, или вы двое можете по очереди. Думайте о «вы», как о «вы все» или «вас обоих», хотя только один из вас запускает каждую команду за раз.)
Первая команда, которую git pull
запускает для вас, всегда git fetch
. Это получает коммиты из другого репозитория Git. В частности, он использует имя хранилища, которое вы называете - или origin
по умолчанию, - чтобы найти коммиты, которые у вас есть, которых у вас нет, предположительно потому, что эти коммиты были добавлены в их репозиторий после того, как вы запустили git clone
. Git помещает эти коммиты в вашу копию хранилища, так что теперь они у вас есть.
Команда second , которую запускает git pull
, обычно git merge
(вы можете настроить ее для запуска другой второй команды, но, очевидно, вы этого не сделали). Когда git pull
запускает git merge
, он предоставляет, как сообщение журнала коммита слияния :
Merge branch '<name>' of <url>
Часть <name>
- это название ветви, которую git pull
сказал git fetch
получить от другого Git. Часть <url>
- это URL, который git pull
велел git fetch
связаться, чтобы получить коммиты, найденные по имени <name>
. Так что если в вашей ветви origin/master
установлено как upstream , ваш git pull
попросит ваш Git вызвать Git на origin
и получить любые новые коммиты от этого 10-го Git master
. Затем ваш git pull
имеет ваш Git merge этих коммитов с сообщением Merge branch 'master' of ...
.
На данный момент у вас есть их (других Git) коммитов и ваших собственных коммитов, плюс коммит слияния , связывающий ваши два набора коммитов вместе , Предполагая, что вы используете свой собственный master
, это выглядит примерно так:
●--●--●
/ \
...--o--o ● <-- master (HEAD)
\ /
o-----o <-- origin/master
Ваши коммиты - те, которые вы сделали сами - находятся в верхнем ряду; общие коммиты находятся в левом среднем ряду; и их коммиты - те, что они сделали после того, как вы клонировали - находятся вдоль нижнего ряда. Самый правый коммит - это новый коммит слияния, который вы только что сделали. Я пометил коммиты, которые у вас , которые они не имеют, как сплошные черные круги ●
.
Теперь вы запускаете git push origin master
, чтобы отправить свои новые коммиты в Git по адресу origin
на GitHub. Это отправляет коммиты, которые yo имеют, которых они не имеют, и затем просит Git GitHub установить его master
, чтобы указать на коммит слияния. Если это так, ваш Git запоминает это, так что ваша собственная диаграмма теперь выглядит так:
●--●--●
/ \
...--o--o ● <-- master (HEAD), origin/master
\ /
o-----o
Когда кто-то еще запускает git fetch
в Git на GitHub, который содержит другую копию, Git's Git's master
теперь будет указывать на тот же самый последний коммит, поэтому вы увидите Merge branch 'master' of <url>
в качестве сообщения журнала подсказки. Максимальный коммит этого master
.
Обдумывая все это, помните, что сейчас здесь задействовано три Git-репозитория. Это GitHub's Git, содержащий копию репозитория, который вы обновляете с помощью git push
. Это Git вашего коллеги, содержащий копию репозитория, который ваш коллега обновляет с GitHub, и который ваш коллега использует git push
для отправки обновлений на GitHub. И есть ваш собственный Git, содержащий копию репозитория, который вы получили от GitHub, где вы используете git push
для отправки обновлений на GitHub. Третий репозиторий GitHub просто действует как точка обмена .