Git получить и потянуть без аргументов - PullRequest
14 голосов
/ 28 июля 2011

У меня есть ветка git с именем foo.

> git status
# On branch foo
nothing to commit (working directory clean)

Первоначально было проверено с помощью этой команды:

> git checkout origin/foo -b foo --track

Я хочу получать обновления для этой ветки из удаленного хранилища. Я знаю, что любой из этих команд будет достаточно:

> git fetch origin foo # ignore the lack of merging
> git pull origin foo

Если я опущу аргументы для fetch или pull, будет ли по умолчанию git извлекать (или извлекать) ветвь, которую я в данный момент извлек? То есть следующие пары команд эквивалент

> git checkout foo
> git pull

и

> git checkout foo
> git pull origin foo

Ответы [ 3 ]

22 голосов
/ 28 июля 2011

К сожалению, эквивалентны они или нет вообще, зависит от того, на какой ветке вы находитесь, вашей конфигурации, фазе луны и т. Д.

Вы можете выяснить это на справочной странице git pull,как я описал ниже, но в целом я бы попытался избежать этого, выполнив: git fetch origin, а затем git merge origin/foo.(Я написал несколько бессвязное сообщение в блоге об этом .)

Однако ваш вопрос на самом деле касается поведения по умолчанию git pull, когда вы не указываете remote или refspec.Мы можем понять это из справочной страницы git pull , и в частности из раздела DEFAULT BEHAVIOUR .Это довольно сложно понять, поэтому я выделил жирным шрифтом только те части, которые действительно относятся к вашему вопросу, учитывая, что (а) вы находитесь на ветке foo, (б) вы создали эту ветку, как описано ввопрос, и (c) вы не меняли свою конфигурацию.

Часто люди используют git pull без указания каких-либо параметров.Традиционно это было равносильно высказыванию git pull origin. Однако, когда в ветви <name> присутствует конфигурация branch.<name>.remote, это значение используется вместо origin.

Чтобы определить, какой URL-адрес использовать для выборки,используется значение конфигурации remote.<origin>.url, и если такой переменной нет, используется значение в строке URL: в файле $GIT_DIR/remotes/<origin>.

Чтобы определить, какие удаленные ветви выбрать (и, необязательно, хранить в ветвях удаленного отслеживания), когда команда запускается без каких-либо параметров refspec в командной строке, используются значения переменной конфигурации remote.<origin>.fetch, а если их нет, то файл $GIT_DIR/remotes/<origin> проверяется ииспользуются Pull: строки.В дополнение к форматам refspec, описанным в разделе ОПЦИИ, у вас может быть глобальный refspec, который выглядит следующим образом:

refs/heads/*:refs/remotes/origin/*

Глобальный refspec должен иметь непустую RHS (т.е.должен хранить то, что было извлечено в ветвях удаленного отслеживания), а его LHS и RHS должны заканчиваться /*.Выше указано, что все удаленные ветви отслеживаются с использованием ветвей удаленного отслеживания в иерархии refs/remotes/origin/ под тем же именем.

Правило определения того, какую удаленную ветвь объединять после выборки, немного задействовано, чтобы ненарушить обратную совместимость.

Если в командной строке git pull были заданы явные refspecs, все они объединяются.

Если в командной строке не было указано refspec, то git pull использует refspecиз конфигурации или $GIT_DIR/remotes/<origin>.В таких случаях применяются следующие правила:

  1. If branch.<name>.merge существует конфигурация для текущей ветви, то есть имя ветви на удаленном сайте, который объединяется.

  2. Если refspec является глобальным, ничто не объединяется.

  3. В противном случае удаленная ветвь первого refspec объединяется.

Когда вы создали ветку foo с помощью:

git checkout origin/foo -b foo --track

... она установит следующие параметры конфигурации, которые связывают вашу ветку foo с refs/heads/foo в репозитории origin:

branch.foo.remote=origin
branch.foo.merge=refs/heads/foo

Итак, если вы объедините это с ободряющими предложениями выше, ответ будет «Да, в этой ситуации вы описываете, когда вы»В ветви foo команды git pull и git pull origin foo эквивалентны. "

4 голосов
/ 11 февраля 2013

Даже в тех условиях, которые описывает Марк, когда они кажутся одинаковыми, есть небольшая разница - git pull origin foo не будет обновлять ветку удаленного отслеживания, тогда как git pull будет. Это задокументировано на странице руководства для git-pull:

A parameter <ref> without a colon is equivalent to <ref>: when pulling/fetching, so it merges <ref> into the current branch without storing the remote branch anywhere locally

Так что в вашем случае для истинного эквивалента git pull вам нужно будет сделать git pull origin foo:refs/remotes/origin/foo

1 голос
/ 28 июля 2011

Да, они есть.Информация отслеживания сохраняется в .git/config.

...