Я думаю, что я на правильном пути, чтобы понять основные концепции Git.
Я уже настроил и клонировал удаленный репозиторий. Я также создал пустой репозиторий на стороне сервера и связал с ним свой локальный репозиторий.
Моя проблема в том, что я не понимаю разницу между:
- Происхождение / мастер против удаленных / происхождение / мастер
Насколько я понял, master - это локальная ветвь, а remotes / origin / master - удаленная.
Но что такое происхождение / мастер ?
git
git-remote
Джон Румпель
источник
источник
.git/refs/origin/master
вообще дрейфовать.git/refs/remotes/origin/master
? Это происходит со мной сейчас, и меня сбивают с толку.Ответы:
Возьмите клон удаленного репозитория и запустите
git branch -a
(чтобы показать все ветки, о которых знает git). Вероятно, это будет выглядеть примерно так:Здесь
master
находится ветка в локальном хранилище.remotes/origin/master
это ветка с именемmaster
на удаленном имениorigin
. Вы можете ссылаться на этоorigin/master
как на:Вы также можете ссылаться на это как
remotes/origin/master
:Это всего лишь два разных способа обращения к одной и той же вещи (кстати, обе эти команды означают «показать мне изменения между удаленной
master
веткой и моейmaster
веткой»).remotes/origin/HEAD
этоdefault branch
для удаленного имениorigin
. Это позволяет вам просто сказатьorigin
вместоorigin/master
.источник
git branch -a
показ удаленной ветви какremotes/origin/master
есть, потому что основной ref хранится в.git/refs/remotes/origin
(если он не был упакован). По моему мнению, выводgit branch -a
мог бы быть намного более ясным, возможно, отделяя имя удаленного от имени ветви чем-то кроме слэша.git branch -r
, что для показа только удаленных ветвей ветка будет отображаться простоorigin/master
потому, чтоremotes/
префикс не нужен.git log
я вижуcommit fa9sd8jasdf98 (HEAD -> master)
, что это значит? Что такое ГОЛОВА в этом случае? Я думал, что я в настоящее время "мастер" и обязалсяorigin/master
. Я думаю, что я что-то перепутал, кто-то может помочь завести? РЕДАКТИРОВАТЬ ОБНОВЛЕНИЕ: Я думаю, что я понял, правильно ли считать, что HEAD в данный момент указывает на ветку master, то есть я сейчас нахожусь в процессе фиксации для master?Краткий ответ для чайников вроде меня (украденных у Торека):
источник
Технически на самом деле нет никаких «удаленных» вещей 1 в вашем репозитории Git, есть только локальные имена, которые должны соответствовать именам в другом, другом репо. Те, что названы,
origin/whatever
будут изначально совпадать с теми в репо, с которого вы клонировали:делает локальную копию другого репо. По пути он отмечает все ветви, которые были там, и фиксирует те, на которые ссылаются, и вставляет их в локальный репозиторий под именами
refs/remotes/origin/
.В зависимости от того, как долго вы
git fetch
проделываете или эквивалентно обновляете «мою копию что-то some.where.out.there», они могут менять свои ветви вокруг, создавать новые и удалять некоторые. Когда вы выполняете свою задачуgit fetch
(илиgit pull
что действительно является извлечением плюс слияние), ваше хранилище сделает копии своей новой работы и при необходимости изменит всеrefs/remotes/origin/<name>
записи. Это тот момент,fetch
когда все совпадает (ну, это, и первоначальный клон, и некоторые случаи использованияpush
тоже - в основном, когда у 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
называется удаленной ветвью , которая иногда сокращается до «удаленной ветви», особенно в более старой или более неофициальной документации.источник
origin/master
наклейку наlocal
график репо, а не наremote
один (я искренне рекомендую презентацию «Git Happens» Джессики Керр для новичковgit
: vimeo.com/46010208 . Я чесал голову между 30:00 - 30: 19.)Я бы постарался сделать ответ @ ErichBSchulz более простым для начинающих:
источник
last time I've checked
нее теряет важный момент$ git remote add origin https://github.com/git/git.git
--- Вы запустите эту команду, чтобы связать ваш проект github с origin. Здесь происхождение определяется пользователем. Вы можете переименовать его$ git remote rename old-name new-name
$ git fetch origin
- Загружает объекты и ссылки из удаленного хранилища на локальный компьютер [origin / master]. Это означает, что это не повлияет на вашу локальную главную ветку, если вы не объедините их, используя$ git merge origin/master
. Не забудьте оформить правильную ветвь, где вам нужно объединиться, прежде чем запускать эту командуПримечание. Извлеченное содержимое представляется в виде удаленной ветви. Fetch дает вам возможность просмотреть изменения, прежде чем интегрировать их в вашу копию проекта. Чтобы показать изменения между вашим и удаленным
$git diff master..origin/master
источник
Одно уточнение (и пункт, который меня смутил):
«remotes / origin / HEAD является веткой по умолчанию» не совсем правильно.
remotes / origin / master был веткой по умолчанию в удаленном репозитории (когда вы последний раз проверяли). ГОЛОВА не ветвь, она просто указывает на ветвь.
Думайте о ГОЛОВЕ как о вашей рабочей зоне. Когда вы думаете об этом таким образом, то «git checkout branchname» имеет смысл изменить файлы рабочей области на файлы определенной ветви. Вы «извлекаете» файлы веток в свою рабочую зону. Голова для всех практических целей - это то, что вы видите в своей рабочей зоне.
источник
HEAD
это «указатель на ветку» (фактический файл в вашем локальном репо часто содержит строкуref: refs/heads/master
, например ... если только он не «отсоединен», что совсем другое дело). Однако в способеclone
интерпретации «удаленного HEAD» есть своего рода ошибка : протоколы передачи вообще не могут отправлять непрямую ветвь, просто необработанный SHA-1, поэтому у git есть kludge, который делает это «главным образом работой». Время от времени кто-то натыкается на странный случай, хотя. Я бы хотел, чтобы git вообще не создавалсяremotes/origin/HEAD
, особенно когда он выходит из строя ...Я думаю, что эту нотацию git slash, вероятно, лучше всего понять, заглянув в вашу
.git
папку.Например, вот несколько сокращенное дерево моего .git для исходной базы LibreOffice.
В Linux
sudo apt-get install tree
полезно посмотреть это.В Windows я думаю, что
tree
команда все еще может работать.Прокрутите вниз и посмотрите на ссылки (так называемые «ссылки») внизу:
Это могло бы быть менее запутанным, если бы оно было так изложено, но это не так:
У нас есть три основных типа ссылок: головы , пульты и теги .
.git / refs / head содержит нашего местного мастера .
.git / refs / remotes может содержать несколько пультов, хотя на данный момент мы имеем только источник .
.git / refs / tags (обсуждается в другом месте).
Происхождение, таким образом, является нашим единственным и отдаленным. Это держит происхождение / мастер .
Мы находим, что у нас есть 2 HEADS (указатели на текущие ветви), один локальный и один удаленный:
Если вы перечислите свои филиалы :
Далее, у вас может быть много удаленных веток отслеживания, и мы делаем это здесь. Вы знаете, что это удаленные ветви отслеживания, потому что они имеют префикс « remotes ». Показанные здесь для удаленного именованного источника.
Таким образом, вторая строка является указателем текущей ветви источника . Remotes / origin: HEAD - указывает на -> мастер. Это показывает, что в удаленном хранилище текущей веткой является их ветвь с именем master (не путать с нашей локальной веткой с именем master ).
Остальные ветви не найдены в вашем .git / refs / tree, скорее вы найдете их в
.git/packed-refs
.Когда мы GIT выборки выполняем мы загружаем изменения из удаленного репозитория в наш удаленный репозиторий отслеживания.
Когда мы сливаемся выполняем мы объединяем изменения в этом локальном удаленном репозитории отслеживания с нашей рабочей локальной ветвью или ветвями, в данном случае с нашей главной ветвью.
(Когда мы выполняем git pull, мы выполняем оба эти шага за одну операцию.)
Также интересно отметить, что эти локальные и удаленные UUID для master в настоящее время указывают на один и тот же узел (он же «commit»):
Таким образом, наш локальный мастер указывает на то же место, что и мастер источника на пульте:
Наконец, я думаю, что также полезно взглянуть на
.git/packed-refs
Без сомнения, это оставляет больше вопросов, чем ответов, но я думаю, что это может помочь вам ответить на ваши собственные вопросы о том, что к чему.
источник