В Git ветвления: Мастер и происхождения/мастер и пультов/происхождения/мастер


Я думаю, что я на правильном пути, чтобы понять основные понятия ЖКТ.

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

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

  • происхождение/Мастер и пультов/происхождения/мастер

насколько я понял, мастер является местным филиалом, и remotes / origin / master дистанционное.

но что же такое origin / master?

6 163

6 ответов:

возьмите клон удаленного репозитория и запустите 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.

короткий ответ для чайников вроде меня (украдено у Торека):

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

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

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

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

в зависимости от того, как долго вы идете, прежде чем вы git fetch или эквивалент обновления " моя копия того, что есть.где.из.там", они могут менять свои ветви вокруг, создавать новые и удалять некоторые из них. Когда вы делаете git fetch (или git pull который действительно fetch plus merge), ваше РЕПО сделает копии своей новой работы и изменит все refs/remotes/origin/<name> записи по мере необходимости. Это тот самый момент fetching, что делает все совпадают (Ну, что, и начальный клон, и некоторые случаи pushing тоже-в основном, когда 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Ну, есть одна вещь, которая составляет под названием "пульт дистанционного управления". Но это тоже местное! Имя origin это то, что Git называет"удаленным". Это в основном просто короткое имя для URL, который вы использовали, когда вы это сделали клон. Это также, где origin на origin/master происходит от. Имя origin/master называется a пульт дистанционного отслеживания ветви, который иногда сокращается до" удаленной ветви", особенно в более старой или более неофициальной документации.

одно уточнение (и что меня смутило):

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

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

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

  1. происхождения - это обычное и наиболее распространенное имя, чтобы указать на remote.

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


  1. мастер - имя ветви по умолчанию в Git-master. Как для удаленного, так и для локального компьютера.

  1. origin / master - это просто указатель для ссылки на главную ветвь в удаленном РЕПО. Помните, я сказал, что origin указывает на удаленный.

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

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

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

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