Что такое 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>), а не сам филиал.