Что такое origin / master в git по сравнению с origin master?
Я хотел добавить этот вопрос в качестве комментария к ответу @KevinBallard здесь в чем разница "origin master "против"origin/master", но мой комментарий был длинным.
Итак, мой вопрос:
Если я нахожусь в ветке под названием topic
, можно просто написать git rebase master
вместо git rebase origin/master
? Или есть действительно два разных местных master
ветки? Одну копию удаленной ветки master и один сам себе хозяин ветки? Если да, то когда я ... --4--> несколько обновлены обе локальные ветви master (одна называется origin/master, а другая-master)? Я очень смущен ...
или, может быть, это такой: origin/master
является локальной копией реальной удаленной главной ветви, в которую был извлечен пульт (скопирован, т. е. просто перезаписаны), и мой местный филиал под названием master
изменяется только тогда, когда я git merge origin/master
(или git rebase …
). То есть: когда я git pull origin master
оба мои локальные копии origin/master
и master
обновление/слился. Конечно предполагая, что в настоящее время я нахожусь в главной ветви (т. е. git checkout master
мой последний заказ).
4 ответов
-
master
ваша местная ветвь. -
origin master
филиалаmaster
в удаленном репозитории с именемorigin
. -
origin/master
ваша локальная копияorigin master
.
когда вы git pull
(что я считаю злом, кто-нибудь еще?), он автоматически делает:
- git fetch: он копирует
origin master
наorigin/master
. (и все остальныеorigin xxx
наorigin/xxx
). - git merge: он сливается
origin/master
вmaster
.
когда вы хотите перебазировать master, вы должны сделать:
- git fetch
- git rebase origin / master
экстракт git help pull
:
точнее git pull работает git fetch с заданными параметрами и звонки git merge чтобы объединить извлеченные головки ветвей в настоящее бранч
<remote>/<branch>
именованная ветвь управляется автоматически git.
когда вы git pull
, то, что git действительно делает, это
git fetch
git merge origin/master
git fetch
автоматическое обновление origin/master
локальная ветвь, чтобы указать на последний коммит origin
ПДУ master
филиала.
так что да, когда вы называете git pull
, оба обновляются. Это потому что fetch
обновления origin/master
и merge
обновления master
.
если я нахожусь в ветке под названием topic, это можно ли просто написать ГИТ перебазирования мастер вместо git перебазирования происхождения/мастер?
вы можете, но мастер не обязательно то же самое, что origin/master
- хотя большую часть времени они находятся. Так что это действительно зависит от вас.
или действительно есть две разные местные главные ветви?
Да, это две разные местные ветви. Они просто обычно указывают на одни и те же коммиты и разделяют общее дерево.
когда вы git pull
на любой ветке, собственно, выполняются две операции:git fetch
и git [merge|rebase]
.
выборка просто загружает все объекты из удаленного РЕПО, что по умолчанию называется origin
. Среди загруженных объектов есть refs-они являются указателями на некоторые конкретные коммиты. Некоторые из этих указателей называются отделения. Если есть master
филиал в удаленном РЕПО origin
, то он будет сохранен как origin/master
внутри вашего локального РЕПО-просто не вмешайтесь в местное отделение с тем же именем.
после извлечения git смотрит на вашу конфигурацию и по умолчанию пытается объединить или перебазировать вашу текущую ветку на ветку из origin
С тем же именем.
в config вы можете указать, какая локальная ветвь будет перезагружена, на какой удаленной ветви-так что вы можете просто запустить git pull
без дополнительных параметров.
отделения просто ссылки на точки фиксации. Теги также являются ссылками для фиксации точек, но ветви отличаются от теги потому что git в определенных ситуациях автоматически обновляет ссылки на ветви, чтобы указать на другую фиксацию. Эти автоматические обновления происходят, скажем, при создании новой точки фиксации (git commit
), тогда ветка, которая нынешний глава обновляется для ссылки на вновь созданную точку фиксации.
Git поддерживает два типа филиалов: локальных и удаленных. Локальная ветвь обновляется, как описано выше. Удаленные ветви обновляются, когда вы делаете: git fetch
.
кроме того, вы можете иметь местные отделения к трек удаленная ветка, в данном случае git pull
- это просто удобство для следующих двух операций: git fetch; git merge origin/<tracked branch>
.
обратите внимание, что локальная ветвь и удаленная ветвь, которая отслеживает, могут иметь разные имена.
так, в вашем случае, когда вы говорите git merge master
, вы сливаете свой местные мастера. когда вы говорите git merge origin/master
, вы объединяете удаленную ветвь (которая, в конечном итоге, может указывать на ту же фиксацию, что и локальный мастер)
также обратите внимание, что вы действительно фиксацию точки что ветка указывает на (вы можете сказать git merge <some commit>
), а не сам филиал.