Понимание.разделы git / config 'remote' и 'branch'
Вот содержимое разделов remote
и branch
моего файла .git/config
.
В чем смысл и назначение содержания этих разделов, в частности подразделов[remote "origin"] url = https://EvanAad@bitbucket.org/EvanAad/bitbucketstationlocations.git fetch = +refs/heads/*:refs/remotes/origin/* [branch "master"] remote = origin merge = refs/heads/master
fetch
и merge
? Как эта информация используется Git для руководства своей работой?2 ответа:
Называется refspec. Это механизм, который git использует для "разговора" с удаленным сервером и сопоставления локальных ветвей с удаленными ветвями.
Рефспексы
Refspec сопоставляет ветвь в локальном репозитории с ветвью в удаленном репозитории.
Это позволяет управлять удаленными ветвями с помощью локальных команд Git и настраивать некоторые расширенные функции git push и git fetch.Refspec определяется как
[+]<src>:<dst>
. Параметр<src>
является источником ветвь в локальном репозитории, а параметр<dst>
является конечной ветвью в удаленном репозитории.
необязательный знак+
предназначен для принудительного выполнения удаленным репозиторием нескоростного обновления.Refspecs можно использовать с командой git push, чтобы дать другое имя удаленной ветви. Например, следующая команда помещает главную ветвь в исходное удаленное РЕПО, как обычный git push, но использует qa-master в качестве имени для ветви в первоначальное РЕПО. Это полезно для групп контроля качества, которым необходимо переместить свои собственные филиалы в удаленное РЕПО.
git push origin master:refs/heads/qa-master
Добавив несколько строк в конфигурационный файл Git, вы можете использовать refspecs для изменения поведения git fetch.
По умолчанию,
git fetch
извлекает все ветви в удаленном репозитории. Причиной этого является следующий раздел файла.git/config
:[remote "origin"] url = https://git@github.com:mary/example-repo.git fetch = +refs/heads/*:refs/remotes/origin/*
Строка
fetch
сообщает git fetch, чтобы загрузить все ветви из происхождение РЕПО.
Но некоторые рабочие процессы не нуждаются во всех из них. Например, многие рабочие процессы непрерывной интеграции заботятся только о главной ветви. Чтобы получить только главную ветвь, измените строку выборки следующим образом:[remote "origin"] url = https://git@github.com:mary/example-repo.git fetch = +refs/heads/master:refs/remotes/origin/master
Аналогичным образом можно настроить git push. Например, если вы хотите всегда нажимать главную ветвь на qa-master в исходном удаленном устройстве (как мы делали выше), вы измените конфигурационный файл на:
[remote "origin"] url = https://git@github.com:mary/example-repo.git fetch = +refs/heads/master:refs/remotes/origin/master push = refs/heads/master:refs/heads/qa-master
Рефспексы дают вам полный контроль над тем, как различные команды Git передают ветви между репозиториями.
Они позволяют вам переименовывать и удалять ветви из вашего локального репозитория,
fetch/push
в ветви с разными именами и настраивать git push и git fetch для работы только с теми ветвями, которые вы хотите.
Запись
merge
под каждым разделомbranch
, я думаю, наименее очевидна. Документация Git держит его немного неясным. Давайте сначала займемся остальными.Настройки в Разделе
[remote "..."]
Существует множество возможных настроек. В общем, вам не нужно устанавливать ни один из них с помощью
git config
напрямую-почти все они имеют команды оболочки, чтобы установить их более "удобным" способом. Это включает в себя оба параметра, которые вы видите здесь. Редко бывает, чтобы захотеть изменить их, любой.Раздел
remote
для каждого именованного удаленного устройства, напримерorigin
, содержит URL-адрес дляgit fetch
(и, возможно, отдельный push-адрес дляgit push
и другихremote.*
элементов конфигурации, как описано в документацииgit config
). Он также имеет одну или несколько строкfetch
, которые предоставляют аргументы по умолчанию refspec дляgit fetch
из этого удаленного.То есть, если вы бежите:
git fetch origin
Git посмотрит вверх
remote.origin.url
, чтобы увидеть, где подключиться, затем подключиться там, затем получение ссылок на основе всех записейremote.origin.fetch
. Значение по умолчанию, которое вы видите здесь:+refs/heads/*:refs/remotes/origin/*
Говорит Git скопировать все ветви 1 с пульта дистанционного управления, переименовав их в ветвь удаленного отслеживания с префиксом
origin/
2 в вашем собственном хранилище, так что:git fetch origin
В основном получает все. (Ведущий
+
говорит, что Git должен делать это независимо от того, является ли обновление ветви удаленного отслеживания операцией быстрой перемотки вперед. То есть это похоже на использование--force
, но без необходимости уточнять--force
.)С другой стороны, если вы бежите:
git fetch origin a:b c:d
Git будетполностью игнорировать все строки
fetch =
, извлекая только ссылкиa
иc
из удаленного хранилища, записывая их в ссылкиb
иd
в вашем репозитории. (И поскольку это не имеет ни+
, ни--force
, ни один из них не будет обновляться принудительно-хотя в большинстве случаев это все равно не имеет значения.)
1, 2 a ссылка - это общий термин, который охватывает обе ветви и теги (и многое другое). Названия ветвей, такие как
master
, являются просто краткими для ссылок, которые начинаются сrefs/heads/
. Имена ветвей удаленного отслеживания, такие какorigin/master
, просто коротки для ссылок, которые начинаются сrefs/remotes/
. Обратите внимание, что частьorigin/
происходит от строкиfetch =
-но для того, чтобы все это работало так, как это предполагается, эта строка должна соответствовать имени пульта дистанционного управления в квадратных скобках.
Параметры под
[branch "..."]
секцияСуществует множество возможных настроек. В общем, вам не нужно устанавливать ни один из них с помощью
git config
напрямую-почти все они имеют команды оболочки, чтобы установить их более "удобным" способом. Это включает в себя оба параметра, которые вы видите здесь. Не так уж редко возникает желание изменить один или оба из них, используя команду, которую мы увидим через мгновение.Часть
remote
довольно ясна сама по себе: это означает, что если вы находитесь на веткеmaster
и запускаетеgit fetch
без давая удаленное имя вообще, Git должен получить от удаленного с именемorigin
.Часть
merge
самая сложная. Он перечисляет имя ветви , как видно на пульте. Обратите внимание, что когда мы запускаемgit fetch origin
, мы говорим нашему Git вызвать другой Git, найти другой Gitmaster
и скопировать его в наш репозиторий, но вызвать егоorigin/master
. И все же ... .. эта строкаmerge
говоритmerge = refs/heads/master
. Разве там не должно быть написано:merge = refs/remotes/origin/master
?Вероятно, так и должно быть-но эта установка предшествует самой изобретение пультов дистанционного управления в первую очередь. Поэтому он не делает этого; вместо этого он перечисляет полное имя ссылки , как оно появляется на удаленном.
Эта настройка используется, если вы запускаете
git merge
илиgit rebase
без указания имени ветви для слияния или перебазирования. Git запускает имя через сопоставления, предоставляемые строкойfetch =
для удаленного устройства, чтобы выяснить, что оно должно сливаться сorigin/master
, например.Эта настройка также используется командой
git pull
удобство, что эффективно3 то же самое, что бегgit fetch
, за которым следует бегgit merge
.Возможно, вы захотите изменить один или оба из них. Например, если вы создадите новую локальную ветвь
feature/tall
, она может иметь нетbranch.feature/tall.remote
иbranch.feature/tall.merge
настройки у всех.Поскольку вы только что создали эту ветвь, нет никакой
origin/feature/tall
. Git вorigin
еще не имеетfeature/tall
, поэтому у вас нет его копии.Затем вы
git push origin feature/tall:feature/tall
, чтобы ваш Git вызвалorigin
Git и пусть их Git создастэту ветвь, так что теперь вы делаете естьorigin/feature/tall
. Возможно, ты захочешь, чтобы твой мерзавец запомнил это.Вы могли бы выполнить две команды
git config
, но вместо этого вы можете выполнить одну команду оболочки более высокого уровня:git branch --set-upstream-to=origin/feature/tall feature/tall
Это говорит вашему Git установить
branch.feature/tall.remote
вorigin
, аbranch.feature/tall.merge
вrefs/heads/feature/tall
(это имя наorigin
).Вы можете объединить шаги
git push
иgit branch --set-upstream-to
с помощьюgit push -u
, что еще лучше, но суть здесь остается: вы используете оболочку, чтобы получить оба значения, установленные одновременно, так как установка только одного значения не так уж и полезна.4
3это намеренно замалчивает множество мелких деталей.
4установка только части
remote
действительно влияет на будущееgit push
, ноgit merge
иgit rebase
не смогут выполнить отображение ветвей удаленного отслеживания без обеих записей.