Git fetch и pull без аргументов
у меня есть ветка 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 ответов
к сожалению, являются ли они эквивалентными или нет вообще зависит от того, какой отрасли вы находитесь, конфигурации, фазы Луны и т. д.
вы можете понять это из git pull
man page, как я описал ниже, но я обычно стараюсь избежать необходимости работать над этим, делая:git fetch origin
а то git merge origin/foo
. (Я написал несколько бессвязное сообщение в блоге об этом.)
однако, ваш вопрос действительно о поведении по умолчанию git pull
когда вы не указываете удаленный или refspec. Мы можем понять это из git pull
man page и в частности DEFAULT BEHAVIOUR
раздел. Это несколько сложно понять, поэтому я выделил жирным шрифтом единственные части, которые действительно применимы к вашему вопросу, учитывая, что (a) вы находитесь на ветке foo
, (b) вы создали эту ветвь, как вы описали в вопросе, и (c) вы не меняли свою конфигурацию.
часто люди используют git pull без указания каких-либо параметров. Традиционно это было равносильно тому, чтобы сказать
git pull origin
. однако, когда конфигурацияbranch.<name>.remote
присутствует на ветке<name>
, это значение используется вместоorigin
.чтобы определить, какой URL использовать для извлечения, значение конфигурации
remote.<origin>.url
консультируется, а если нет такой переменной, значениеURL:
в строке это.In чтобы определить, какие удаленные ветви извлекать (и необязательно хранить в ветвях удаленного отслеживания), когда команда выполняется без каких-либо параметров refspec в командной строке, значения переменной конфигурации
remote.<origin>.fetch
консультируются, и если их нет,$GIT_DIR/remotes/<origin>
файл консультируется и его линии. В дополнение к форматам refspec, описанным в разделе OPTIONS, у вас может быть глобальный refspec, который выглядит следующим образом:
refs/heads/*:refs/remotes/origin/*
глобирующий refspec должен иметь непустой RHS (т. е. должен хранить то, что было извлечено в ветвях удаленного отслеживания), а его LHS и RHS должны заканчиваться
/*
. Выше указано, что все удаленные ветви отслеживаются с помощью ветвей удаленного отслеживания вrefs/remotes/origin/
иерархия под тем же названием.правило, чтобы определить, какую удаленную ветвь объединить после извлечения, немного задействовано, чтобы не нарушить обратную совместимость.
если явные refspecs были учитывая в командной строке git pull, все они объединены.
когда никакой 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
эквивалентны."
даже в условиях, описанных Марком, когда они кажутся одинаковыми, все еще есть тонкая разница - git pull origin foo
не будет обновлять ветку удаленного отслеживания, тогда как git pull
будет. Это задокументировано в manpage для 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