Вопрос по git, git-remote – Разветвление Git: мастер против источника / мастер против удаленных / источник / мастер
Я думаю, что я на правильном пути, чтобы понять основные концепции git.
Я уже настроил и клонировал удаленный репозиторий. Я также создал пустой репозиторий на стороне сервера и связал с ним свой локальный репозиторий.
Моя проблема в том, что я не понимаю разницу между:
origin/master vs. remotes/origin/masterНасколько я понял,master это местный филиал, иremotes/origin/master это отдаленный.
Но что именноorigin/master?
$ git remote add origin
https://github.com/git/git.git --- Вы запустите эту команду, чтобы связать ваш проект github с origin. Здесь происхождениеuser-defined.
$ git remote rename old-name new-name
$ git fetch origin
- Загружает объекты и ссылки из удаленного хранилища на локальный компьютер [origin / master]. Это означает, что это не повлияет на вашу локальную главную ветку, если вы не объедините их, используя$ git merge origin/master
, Не забудьте оформить правильную ветвь, где вам нужно объединиться, прежде чем запускать эту команду
Note: Fetched content is represented as a remote branch. Fetch gives you a chance to review changes before integrating them into your copy of the project. To show changes between yours and remote $git diff master..origin/master
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
.
git log
я вижуcommit fa9sd8jasdf98 (HEAD -> master)
, что это значит? Что такое ГОЛОВА в этом случае? Я думал, что я в настоящее время "мастер" и совершалиorigin/master
, Я думаю, что я что-то перепутал, кто-то может помочь завести? РЕДАКТИРОВАТЬ ОБНОВЛЕНИЕ: Я думаю, что я понял, правильно ли считать, что HEAD в данный момент указывает на ветку master, то есть я сейчас нахожусь в процессе фиксации для master?
git branch -r
, который должен показывать только удаленные ветви, покажет только веткуorigin/master
посколькуremotes/
префикс не обязателен.
git branch -a
показывая удаленную ветку какremotes/origin/master
отчасти потому, что основной ссылка хранится в.git/refs/remotes/origin
(если он не был упакован). На мой взгляд, выходgit branch -a
может быть гораздо яснее, возможно, отделив имя удаленного от имени ветви с чем-то, кроме косой черты.
& quot; пульты / origin / HEAD - это ветвь по умолчанию & quot; не совсем правильно.
remotes / origin / master была веткой по умолчанию в удаленном репозитории (когда вы последний раз проверяли). ГОЛОВА не ветвь, она просто указывает на ветвь.
Думайте о ГОЛОВЕ как о вашей рабочей зоне. Когда вы думаете об этом таким образом, тогда «git checkout branchname» имеет смысл изменить файлы рабочей области на файлы определенной ветви. Вы & quot; оформить заказ & quot; Разместите файлы в вашей рабочей области. Голова для всех практических целей - это то, что вы видите в своей рабочей зоне.
HEAD
является "указателем на ветку" (фактический файл в вашем локальном репо часто содержит строкуref: refs/heads/master
например ... если только он "не отделен", что является совершенно другой вещью). Однако в этом есть какая-то ошибкаclone
интерпретирует «удаленный HEAD»: протоколы передачи вообще не могут отправлять непрямую ветвь, просто необработанный SHA-1, поэтому у git есть команда, которая делает это «в основном работой». Время от времени кто-то натыкается на странный случай, хотя. Я вроде бы не хотел создать мерзавцаremotes/origin/HEAD
вообще, особенно когда выходит не так ...
1 в вашем репозитории Git есть только локальные имена, которыеshould соответствуют имена на другой, другой репо. Названные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
что все совпадает (ну, это, и первоначальный клон, и некоторые случаиpush
ing in & # x2014; в основном всякий раз, когда Git получает возможность проверить & # x2014; но см. предостережение ниже).
Git обычно ссылается на ваш собственныйrefs/heads/<name>
как раз<name>
и удаленные какorigin/<name>
и все это работает только потому, что очевидно, какой из них есть какой. Иногда возможно создать свои собственные имена ветвей, которые делают это не очевидным, но не беспокойтесь об этом, пока это не произойдет. :-) Просто дайте Git самое короткое имя, которое делает его очевидным, и оно пойдет оттуда:origin/master
где мастер был там в прошлый раз, когда я проверял & quot; иmaster
"где мастер находится здесь на основе того, что я делал". Бежатьgit fetch
обновить Git на «где мастер там» по мере необходимости.
Предостережение: в версиях Git старше 1.8.4,git fetch
имеет некоторые режимы, которые не обновляют, где мастер находится там. (точнее, режимы, которые не обновляют ветки удаленного отслеживания). Бегgit fetch origin
, или жеgit fetch --all
или даже простоgit fetch
, does Обновить. Бегgit fetch origin master
doesn't, К сожалению, это «не обновляет» режим запускается обычнымgit pull
, (Это в основном незначительное раздражение и исправлено в Git 1.8.4 и позже.)
1Ну, есть одна вещь, котораяcalled & quot; удаленный & quot ;. Но это также локально! Имяorigin
это то, что Git называет «удаленным». Это в основном просто короткое имя для URL, который вы использовали при клонировании. Это также гдеorigin
вorigin/master
происходит от. Имяorigin/master
называетсяremote-tracking branch, который иногда сокращается до «удаленной ветви», особенно в более старой или более неофициальной документации.
origin/master
наклейка наlocal
график репо, а не наremote
одна (я искренне рекомендую презентацию Джессики Керр "Git Happens" для людей, плохо знакомых сgit
: vimeo.com/46010208, Я чесал голову между 30:00 - 30:19.)
I think this git slash notation is probably best understood by looking inside your .git
folder.
Например, вот несколько сокращенное дерево моего .git для исходной базы LibreOffice.
Вlinux sudo apt-get install tree
Это полезно для просмотра.
ВWindows я думаюtree
команда все еще может работать.
Прокрутите вниз и посмотрите на ссылки (также называемые ссылками) внизу:
$ tree
.
├── branches
├── config
├── description
├── FETCH_HEAD
├── gitk.cache
├── HEAD
├── hooks
│ ├── applypatch-msg.sample
...
├── index
├── info
│ └── exclude
├── logs
│ ├── HEAD
│ └── refs
│ ├── heads
│ │ ├── master
│ │ └── remotes
│ │ └── origin
│ └── remotes
│ └── origin
│ ├── distro
│ │ ├── cib
│ │ │ └── libreoffice-6-0
│ │ ├── collabora
│ │ │ └── cp-6.0
│ │ └── lhm
│ │ └── libreoffice-5-2+backports
│ ├── HEAD
│ ├── libreoffice-6-2
│ ├── master
│ └── private
│ └── mst
│ └── sw_redlinehide_4a
├── objects
│ ├── info
│ └── pack
│ ├── pack-b80087dc57e2b3315f449ca0f1aaa91987bf0c5e.idx
│ ├── pack-b80087dc57e2b3315f449ca0f1aaa91987bf0c5e.pack
│ ├── pack-eb4e6808029e712d8d9c2671accbbd98aaeb9a04.idx
│ └── pack-eb4e6808029e712d8d9c2671accbbd98aaeb9a04.pack
├── ORIG_HEAD
├── packed-refs
└── refs
├── heads
│ ├── master
│ └── remotes
│ └── origin
├── remotes
│ └── origin
│ ├── distro
│ │ ├── cib
│ │ │ └── libreoffice-6-0
│ │ ├── collabora
│ │ │ └── cp-6.0
│ │ └── lhm
│ │ └── libreoffice-5-2+backports
│ ├── HEAD
│ ├── libreoffice-6-2
│ ├── master
│ └── private
│ └── mst
│ └── sw_redlinehide_4a
└── tags
└── libreoffice-6-2-branch-point
32 directories, 45 files
Это могло бы быть менее запутанным, если бы оно было так изложено, но это не так:
repositories (i.e. independent trees)
├──local
│ └──master
│
└──origin1
│ └──master
└──origin2
└──master
У нас есть три основных типа ссылок:heads, remotes, а такжеtags.
.git/refs/heads holds our local master.
.git/refs/remotes can hold a number of remotes, although at the moment we only have origin in it.
.git/refs/tags (is discussed elsewhere).
origin таким образом, это наш единственный пульт. Держитorigin/master.
Мы находим, что у нас есть 2HEADS (указатели на текущие ветви), один локальный и один удаленный:
$ cat .git/HEAD # local: HEAD -> master
ref: refs/heads/master
$ cat .git/refs/remotes/origin/HEAD # remote origin: HEAD -> master
ref: refs/remotes/origin/master
Если вы перечислитеbranches:
$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/aoo/aw080
remotes/origin/aoo/trunk
remotes/origin/distro/capgemini/cg-4.1
remotes/origin/distro/cib/libreoffice-5-0
remotes/origin/distro/cib/libreoffice-5-1
remotes/origin/distro/cib/libreoffice-5-2
...
The first branch listed (master) is the only one which is not a remote. So in this case we have one local branch. This is where we'll start our own work from, for our own new branches and subsequent commits.
Далее, у вас может быть много удаленных веток отслеживания, и мы делаем это здесь. Вы знаете, что это удаленные ветви отслеживания, потому что они имеют префикс & apos;remotes/& APOS ;. Те, что показаны здесь, предназначены для удаленного именованного источника.
So the second line is origin's current branch pointer. Remotes/origin: HEAD --points to--> master. This shows that in the remote repository, the current branch is their branch named master, (not to be confused with our local branch named master).
The remaining branches aren't found in your .git/refs/ tree, but rather you'll find them in .git/packed-refs
.
Когда мыgit fetch мы загружаем изменения из удаленного репозитория в наш удаленный репозиторий отслеживания.
Когда мыgit merge мы объединяем изменения в этом локальном удаленном репозитории отслеживания с нашей рабочей локальной ветвью или ветвями, в данном случае с нашей главной ветвью.
(Когда мыgit pull мы делаем оба эти два шага в одной операции.)
Интересно также отметить этиlocal а такжеremote UUID дляmaster в данный момент указывают на тот же узел (он же "commit"):
$ cat refs/heads/master # local master
1ca409292272632f443733450313de5a82c54a9c
$ cat refs/remotes/origin/master # remote origin master
1ca409292272632f443733450313de5a82c54a9c
Таким образом, наш локальный мастер указывает на то же место, что и удаленный мастер происхождения:
[local] master = [remote] origin master
Наконец, я думаю, что также полезно взглянуть на.git/packed-refs
$ cat packed-refs
# pack-refs with: peeled fully-peeled
3c1d4742e649fe9c8aed8c2817fe3e1f3364f298 refs/remotes/origin/aoo/aw080
e87c8b7922e9a73e0abb7f9a7a47c9ac3374a826 refs/remotes/origin/aoo/trunk
b70fdffb041c12f124dcc0822b61bf3450e53137 refs/remotes/origin/distro/capgemini/cg-4.1
5dbc3f1754809b9489faaf380b1a4bdbcfbb6205 refs/remotes/origin/distro/cib/libreoffice-5-0
cfdbc96ca47d68d6785fd21829a8d61f49d6e591 refs/remotes/origin/distro/cib/libreoffice-5-1
5189c8c47461ef09739086e55512fc6a10245273 refs/remotes/origin/distro/cib/libreoffice-5-2
3bee5917569ca8e6ee3b086458f5b1a917b88ca1 refs/remotes/origin/distro/cib/libreoffice-5-3
92fbe703f9ca480d3a2b8610d87e991c729edf77 refs/remotes/origin/distro/cib/libreoffice-5-4
05c0a5df66cc69d75280f05b804cf82f3387d42b refs/remotes/origin/distro/cib/libreoffice-6-0
7fe193e759b24b90852e6e327115b77114d7b119 refs/remotes/origin/distro/cib/libreoffice-6-1
8187f7aa413e7ef7b377eea2b057d336bf256867 refs/remotes/origin/distro/collabora/cd-5.3
7a6b608591e21ef61dc05cff9fc58da531035755 refs/remotes/origin/distro/collabora/cd-5.3-3.1
....
Без сомнения, это оставляет больше вопросов, чем ответов, но я думаю, что это может помочь вам ответить на ваши собственные вопросы о том, что и что.