К сожалению, эквивалентны они или нет вообще, зависит от того, на какой ветке вы находитесь, вашей конфигурации, фазе луны и т. Д.
Вы можете выяснить это на справочной странице 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>
.В таких случаях применяются следующие правила:
If branch.<name>.merge
существует конфигурация для текущей ветви, то есть имя ветви на удаленном сайте, который объединяется.
Если refspec является глобальным, ничто не объединяется.
В противном случае удаленная ветвь первого 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
эквивалентны. "