Что такое начало/мастер в git по сравнению с исходным мастером?

Я хотел бы добавить этот вопрос в качестве комментария к ответу @KevinBallard здесь В чем разница и "главный хозяин" , vs "origin/master ", но мой комментарий был длинным.

Итак, мой вопрос: Если я нахожусь в ветки с именем topic, можно ли просто написать git rebase master вместо git rebase origin/master? Или существуют две разные локальные ветки master? Один из них является копией удаленной ведущей ветки, а другой - моей собственной ветвью мастера? Если это так: когда я git pull являются локальными главными ветвями (один называется origin/master, а другой только что называется master) обновлен? Я очень смущен...


Или, может быть, это так: origin/master - это локальная копия реальной удаленной ведущей ветки, к которой был извлечен удаленный (скопированный, т.е. только перезаписан), и моя локальная ветвь называется master изменяется только при я git merge origin/master (или git rebase …). То есть: Когда я git pull origin master обновляются и объединены моя локальная копия origin/master и master. Конечно, предполагая, что я нахожусь в главной ветке (т.е. git checkout master была моей последней проверкой).

Ответ 1

  • 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.

Если вы хотите переустановить мастера, вы должны сделать:

  • git fetch
  • git rebase origin/master

извлечение git help pull:

Точнее, git pull работает git fetch с заданными параметрами и вызывает git merge strong > , чтобы объединить полученные ветки ветвей в ветвь current

Ответ 2

<remote>/<branch> named branch управляется автоматически с помощью git.

Когда вы выполняете git pull, что действительно делает git, это

git fetch  
git merge origin/master

git fetch автоматически обновляет локальную ветвь origin/master, чтобы указать на последнее завершение ветки origin remote master.

Итак, когда вы вызываете git pull, оба они обновляются. Это потому, что fetch обновляет origin/master и merge обновления master.

Если я нахожусь в ветки, называемой темой, можно ли просто написать git мастер перезаписи вместо git rebase origin/master?

Вы можете, но мастер не обязательно совпадает с origin/master - хотя большую часть времени они есть. Так что это действительно зависит от вас.

Или существуют действительно две разные локальные ветки?

Да, это две разные локальные ветки. Они обычно указывают на одни и те же коммиты и разделяют общее дерево.

Ответ 3

Когда вы выполняете git pull в любой ветки, фактически выполняются две операции: git fetch и git [merge|rebase].

Загрузка только загружает все объекты из удаленного репо, по умолчанию называется origin. Среди скачанных объектов есть refs - они являются указателями на некоторые конкретные фиксации. Некоторые из этих указателей называются ветвями. Если в удаленном репо origin есть ветвь master, она будет сохранена как origin/master внутри вашего локального репо - просто чтобы не мешать вашей локальной ветке с тем же именем.

После выбора, git просматривает вашу конфигурацию и по умолчанию пытается объединить или переустановить вашу текущую ветку на ветку из origin с тем же именем.

В конфигурации вы можете указать, какая локальная ветвь будет переустановлена ​​на какую удаленную ветку - так что вы можете просто запустить git pull без дополнительных параметров.

Ответ 4

Филиалы - это просто ссылки на точки фиксации. Теги также ссылаются на фиксацию точек, но ветки отличаются от тегов, потому что git в определенных ситуациях автоматически обновляет ссылки на ветку, указывая на другую фиксацию. Эти автоматические обновления происходят, скажем, при создании новой точки фиксации (git commit), тогда ветвь, текущая HEAD, обновляется, чтобы ссылаться на вновь созданную точку фиксации.

Git поддерживает два типа ветвей: локальный и удаленный. Локальная ветка обновляется, как описано выше. Удаленные ветки обновляются, когда вы делаете: git fetch.

Кроме того, вы можете иметь локальную ветвь для отслеживания удаленной ветки, в этом случае git pull является просто удобством для следующих двух операций: git fetch; git merge origin/<tracked branch>.

Обратите внимание, что локальная ветвь и удаленная ветвь, которые отслеживают, могут иметь разные имена.

Итак, в вашем случае, когда вы говорите git merge master, вы объединяете своего локального хозяина. когда вы говорите git merge origin/master, вы объединяете удаленную ветвь (которая, в конечном итоге, может указывать на то же самое, что и локальный мастер)

Также обратите внимание, что вы действительно объединяете точку фиксации, на которую указывает точка перехода (вы можете сказать git merge <some commit>), а не ветвь.