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>. В таких случаях применяются следующие правила:

  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 эквивалентны."


даже в условиях, описанных Марком, когда они кажутся одинаковыми, все еще есть тонкая разница - 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


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