Различия между удаленным обновлением git и получением? - PullRequest
170 голосов
/ 06 декабря 2009

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

Ответы [ 2 ]

140 голосов
/ 06 декабря 2009

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

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

100 голосов
/ 07 июля 2013

ОБНОВЛЕНИЕ: больше информации!

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

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, но решили не удалять ее, возможно, для обратной совместимости. с существующими сценариями и программами, или, возможно, потому, что это слишком много работы и есть элементы с более высоким приоритетом.


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

ответу xenoterracide исполнилось 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) . & Mdash; документация git-config

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

git remote update

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

Текущая документация 1.8.3.2 для конфигурации Git не упоминает настройку remotes.default, но я проконсультировался с Всемогущим 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 позволяет вам указать несколько хранилищ и групп хранилищ для выборки одновременно (из документов ):

Разрешить указание нескольких аргументов <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].

...