Различия между git удаленным обновлением и извлечением?

Является git remote update эквивалентом git fetch?

Ответ 1

ОБНОВЛЕНИЕ: дополнительная информация!

Я должен был сделать это с самого начала: я grepped примечания о выпуске Git в Git Git repo (так мета!)

grep --color=always -R -C30 fetch Documentation/RelNotes/* | less

Затем я выполнил поиск less --all, и это то, что я нашел в примечания к выпуску для Git версии 1.6.6:

git fetch выучили опции --all и --multiple, чтобы запустить выборку из многих репозиториев и --prune, чтобы удалить ветки удаленного отслеживания, которые были устаревшими. Они делают меньше git remote update и git remote prune менее необходимым (план удаления remote update и remote prune не существует).

Версия 1.6.6 не была выпущена до 23 декабря 2009 г. и Оригинальный плакат задал свой вопрос 6 декабря 2009 года.

Итак, как вы можете видеть из примечаний к выпуску, авторы Git знали о том, что функциональность команды git remote update несколько дублируется на git fetch, но они решили не удалять ее, возможно, для обратная совместимость с существующими сценариями и программами, или, может быть, потому, что это слишком много работает, и есть пункты с более высоким приоритетом.


Оригинальный ответ с подробной информацией

ответ на ксенотрацид теперь составляет 3,5 года, а Git прошел через несколько версий с тех пор (он перешел от v1.6.5.5 до v1.8.3.2 на момент написания этой статьи), и глядя на текущая документация для git remote update и git fetch, похоже, что они обе могут выполнять в основном ту же функцию, что и для получения новых коммитов из нескольких пультов, учитывая правильные варианты и аргументы.

Получение всех пультов

Один способ получить несколько пультов - это флаг --all:

git fetch --all

Это будет извлечено из всех ваших настроенных пультов, предполагая, что у вас нет remote.<name>.skipFetchAll для них:

Если true, этот пульт будет пропущен по умолчанию при обновлении с помощью git -fetch (1) или подкоманду обновления git -remote (1). — git -config documentation

Это будет эквивалентно использованию

git remote update

без указания какой-либо удаленной группы для извлечения, а также не имеющей remotes.default, установленного в вашей конфигурации репо, а также, что ни один из ваших пультов не имеет remote.<name>.skipDefaultUpdate, установленного в true.

текущая документация 1.8.3.2 для конфигурации Git не упоминает remotes.default, но я посоветовался с The Almighty Google и нашел это полезное объяснение из Mislav Marohnić:

$ git config remotes.default 'origin mislav staging'
$ git remote update

# fetches remotes "origin", "mislav", and "staging"

Вы можете определить список пультов по умолчанию, который будет выбран командой remote update. Это могут быть удаленные от ваших товарищей по команде, доверенные члены сообщества проекта с открытым исходным кодом или аналогичные.

Предположительно, если у вас установлен remotes.default, и не все ваши пульты перечислены в нем, то git remote update не будет извлекать все пульты, которые ваше репо "знает".

Что касается установки remote.<name>.skipDefaultUpdate, Git docs объясняет это следующим образом:

Если true, этот пульт будет пропущен по умолчанию при обновлении с помощью git -fetch (1) или подкоманду обновления git -remote (1).

Получение заданной группы пультов

Вместо того, чтобы извлекать все пульты, оба fetch и remote update позволяют указать несколько пультов и групп пультов для выбора:

git fetch [<options>] <group>
git fetch --multiple [<options>] [(<repository> | <group>)…]

git fetch [<options>] <group> позволяет вам извлекать несколько пультов, которые являются частью группы (заимствовать другой пример из Mislav):

$ git config remotes.mygroup 'remote1 remote2 ...'
$ git fetch mygroup

git fetch --multiple позволяет вам указать сразу несколько репозиториев и групп репозитория (из docs):

Разрешить несколько аргументов <repository> и <group>. Нет <refspec>s может быть указано.

Неоднозначность в документации git remote update

синопсис для git remote update указывает, что синтаксис команды выглядит следующим образом:

git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)…]

Обратите внимание на последнюю часть, [(<group> | <remote>)…]? Конечные точки ... подразумевают, что вы можете указать несколько групп и пультов с помощью команды, что означало бы, что она ведет себя так же, как git fetch --multiple... видя, насколько синтаксис между двумя настолько похож?

Однако в том же документе объяснение команды update ничего не говорит о задании нескольких групповых и удаленных аргументов, только то, что оно

Извлеките [es] обновления для именованного набора пультов в репозитории, как определено remotes.<group>.

Так что неясно, работает ли git remote update тождественно с git fetch --multiple в отношении указания нескольких отдельных пультов и нескольких удаленных групп.

Получение одного удаленного

Наконец, каждый знает простой случай извлечения одного пульта:

git fetch <remote>

Возможно, вы также можете использовать

git remote update <remote>

чтобы сделать то же самое, но, как я уже упоминал в предыдущем разделе, документация для git remote update неясно, можно ли получить что-либо, кроме одной группы пультов с командой.

Wrapup

Как я уже объяснял, git fetch и git remote update ведут себя так же, как выборка из нескольких пультов. Они имеют сходный синтаксис и аргументы, хотя git fetch короче, поэтому людям, вероятно, легче набирать и использовать.

Возможно, что git remote update нельзя использовать для получения только одного удаленного, например, с помощью git fetch, но, как я уже указывал, документация не делает этого ясно.

Помимо

Дупликация в функциональности между командами Git фарфора, приведенная в качестве примера git fetch и git remote update выше, не уникальна. Я заметил аналогичную ситуацию с git rebase --onto и git cherry-pick, поскольку оба могут совершить ряд коммитов для исправления новой фиксации базы.

Я предполагаю, что, поскольку Git развивался с годами, некоторые функциональные возможности (неизбежно?) дублировались, возможно, иногда как удобство для конечных пользователей (например, проще передать диапазон до cherry-pick, чем для передачи одного и того же кода для выбора диапазона). По-видимому, cherry-pick не всегда принимал ряд коммитов, как описано в примечаниях v1.7.2:

git cherry-pick научился выбирать диапазон коммитов (например, cherry-pick A..B и cherry-pick --stdin), так что git revert; однако они не поддерживают более удобное управление секвенированием rebase [-i].

Ответ 2

Да и нет. git remote update извлекает из всех пультов, а не только один.

Не смотря на код, чтобы увидеть, является ли remote update оболочкой script (возможно), он, в основном, запускает выборку для каждого пульта. git fetch может быть гораздо более зернистым.