Git ветвление: мастер против источника/хозяина против пультов/источник/мастер

Я думаю, что нахожусь на правильном пути, чтобы понять основные понятия git.

Я уже создал и клонировал удаленный репозиторий. Я также создал пустой репозиторий на стороне сервера и связал с ним свой локальный репозиторий.

Моя проблема в том, что я не понимаю разницы между:

  • origin/master vs. remotes/origin/master

Насколько я понял, master является локальной ветвью, а remotes/origin/master является удаленным.

Но что такое origin/master?

Ответ 1

Возьмите клон удаленного репозитория и запустите git branch -a (чтобы показать все ветки git). Вероятно, это выглядит примерно так:

* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

Здесь master является ветвью в локальном репозитории. remotes/origin/master - это ветвь с именем master на удаленном сервере с именем origin. Вы можете ссылаться на это как на origin/master, как на:

git diff origin/master..master

Вы также можете ссылаться на него как remotes/origin/master:

git diff remotes/origin/master..master

Это всего лишь два разных способа обращения к одной и той же вещи (кстати, обе эти команды означают "показать мне изменения между удаленной ветвью master и ветвью master).

remotes/origin/HEAD является default branch для удаленного имени origin. Это позволяет просто сказать origin вместо origin/master.

Ответ 2

Короткий ответ для таких манекенов, как я (украден из Торека):

  • origin/master - это "где мастер был в последний раз, когда я проверил"
  • master - это "где здесь мастер, основанный на том, что я делал"

Ответ 3

Технически нет никаких "remote" вещей вообще 1 в вашем репозитории Git, есть только локальные имена, которые должны соответствовать именам другого, другому репо. Те, которые называются origin/whatever, будут вначале совпадать с теми, которые вы клонировали в репо, из:

git clone ssh://some.where.out.there/some/path/to/repo # or git://some.where...

создает локальную копию другого репо. По пути он отмечает все ветки, которые были там, и совершает те, которые ссылаются, и вставляет их в ваше местное репо под именами refs/remotes/origin/.

В зависимости от того, как долго вы ходите до вас git fetch или эквивалентно обновлению "моей копии того, что some.where.out.there", они могут менять свои ветки, создавать новые и удалять некоторые. Когда вы выполняете свой git fetch (или git pull, который действительно извлекает плюс слияние), ваше репо будет делать копии своей новой работы и изменять все записи refs/remotes/origin/<name> по мере необходимости. Это тот момент fetch ing, который делает все совпадающим (ну, и исходный клон, а также некоторые случаи push ing тоже - в основном, когда Git получает возможность проверить, но см. Ниже).

Git обычно вы ссылаетесь на свой собственный refs/heads/<name> как на <name>, а на удаленные - origin/<name>, и все это работает, потому что очевидно, какой из них есть. Иногда можно создавать собственные имена ветвей, которые делают это не очевидным, но не беспокойтесь об этом, пока это не произойдет.:-) Просто дайте Git кратчайшее имя, которое делает его очевидным, и оно будет идти оттуда: origin/master - это "где мастер был в последний раз, когда я проверил", а master - это "где мастер здесь" основанный на том, что я делал ". Запустите git fetch, чтобы обновить Git на" где мастер там", если необходимо.


Предостережение: в версиях Git старше 1.8.4, git fetch имеет несколько режимов, которые не обновляют "там, где мастер там" (точнее, режимы, которые не обновляют ветки удаленного отслеживания). Выполняется обновление git fetch origin или git fetch --all, или даже просто git fetch. Запуск git fetch origin master нет. К сожалению, этот режим "не обновляется" запускается обычным git pull. (Это в основном только незначительное раздражение и исправлено в Git 1.8.4 и более поздних версиях.)


1 Ну, есть одна вещь, которая называется "remote". Но это тоже местное! Имя origin - это то, что Git вызывает "удаленный". Это в основном просто короткое имя для URL-адреса, который вы использовали, когда вы делали клон. Это также происходит из origin in origin/master. Имя origin/master называется ветвью удаленного отслеживания, которая иногда сокращается до "удаленной ветки", особенно в старой или более неформальной документации.

Ответ 4

Одно разъяснение (и точка, которая меня смутила):

"remotes/origin/HEAD - это ветка по умолчанию" не совсем правильно.

remotes/origin/master - это ветвь по умолчанию в удаленном репозитории (последний раз, когда вы проверили). HEAD не является ветвью, он просто указывает на ветку.

Подумайте о HEAD как о своей рабочей области. Когда вы думаете об этом таким образом, тогда "git checkout branchname" имеет смысл в отношении изменения файлов вашей рабочей области в зависимости от конкретной ветки. Вы "проверяете" файлы веток в своей рабочей области. HEAD для всех практических целей - то, что видно вам в вашей рабочей области.

Ответ 5

  • origin. Это обычное и наиболее распространенное имя, указывающее на удаленный.

$ git remote add origin https://github.com/git/git.git --- Вы запустите эту команду, чтобы связать проект github с исходным кодом. Здесь начало определено пользователем. Вы можете переименовать его на $ git remote rename old-name new-name


  1. мастер. Имя ветки по умолчанию в Git - это мастер. Для удаленного и локального компьютера.
    1. origin/master. Это всего лишь указатель на направление основной ветки в удаленном репо. Помните, что я указал исходные точки на удаленный.

$ git fetch origin - Загрузка объектов и ссылок из удаленного хранилища на локальный компьютер [origin/master]. Это означает, что это не повлияет на вашу локальную ветвь мастера, если вы не объедините их с помощью $ git merge origin/master. Не забудьте проверить правильную ветку, где вам нужно слить, прежде чем запускать эту команду

Примечание. Полученный контент представлен как удаленная ветвь. Fetch дает вам возможность просмотреть изменения, прежде чем интегрировать их в свою копию проекта. Чтобы показать изменения между вашим и удаленным $git diff master..origin/master

Ответ 6

Я попытался бы сделать @ErichBSchulz проще для новичков:

  • origin/master - состояние ведущей ветки в удаленном репозитории
  • master - состояние ведущей ветки в локальном репозитории