Является git remote update
эквивалентом git fetch
?
Различия между git удаленным обновлением и извлечением?
Ответ 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
может быть гораздо более зернистым.