Краткий ответ
Пока вы выполняете ускоренное слияние, вы можете просто использовать
git fetch <remote> <sourceBranch>:<destinationBranch>
Примеры:
# Merge local branch foo into local branch master,
# without having to checkout master first.
# Here `.` means to use the local repository as the "remote":
git fetch . foo:master
# Merge remote branch origin/foo into local branch foo,
# without having to checkout foo first:
git fetch origin foo:foo
Хотя ответ Амбер также будет работать в случаях ускоренной перемотки вперед, использование git fetchэтого способа немного безопаснее, чем просто принудительное перемещение ссылки ветвления, поскольку git fetchавтоматически предотвратит случайные не быстрые перемотки вперед, если вы не используете +в refspec.
Длинный ответ
Вы не можете объединить ветвь B с ветвью A без предварительной проверки A, если это приведет к слиянию без ускоренной перемотки вперед. Это потому, что рабочая копия необходима для разрешения любых потенциальных конфликтов.
Однако в случае слияния с ускоренной пересылкой это возможно , поскольку по определению такие слияния никогда не приводят к конфликтам. Чтобы сделать это без предварительной проверки ветки, вы можете использоватьgit fetch с refspec.
Вот пример обновления master(запрещающий изменения без ускоренной перемотки вперед), если у вас есть другая ветвь, featureпроверенная:
git fetch upstream master:master
Этот вариант использования настолько распространен, что вы, вероятно, захотите создать для него псевдоним в файле конфигурации git, например:
[alias]
sync = !sh -c 'git checkout --quiet HEAD; git fetch upstream master:master; git checkout --quiet -'
Этот псевдоним делает следующее:
git checkout HEAD: это переводит вашу рабочую копию в отдельное состояние. Это полезно, если вы хотите обновить, masterпока вы его не извлекли. Я думаю, что это было необходимо сделать, потому что в противном случае ссылка на ветвь для masterне будет двигаться, но я не помню, действительно ли это не в моей голове.
git fetch upstream master:master: это переместит ваш местный житель masterв то же место, что и upstream/master.
git checkout -проверяет вашу ранее извлеченную ветку (это то, что -делает в этом случае).
Синтаксис git fetch для (не) ускоренного слияния
Если вы хотите, чтобы fetchкоманда потерпела неудачу, если обновление происходит без ускоренной перемотки, вы просто используете refspec в форме
git fetch <remote> <remoteBranch>:<localBranch>
Если вы хотите разрешить обновления без ускоренной пересылки, добавьте a +в начало refspec:
git fetch <remote> +<remoteBranch>:<localBranch>
Обратите внимание, что вы можете передать свой локальный репозиторий как «удаленный» параметр, используя .:
git fetch . <sourceBranch>:<destinationBranch>
Документация
Из git fetchдокументации, которая объясняет этот синтаксис (выделено мной):
<refspec>
Формат <refspec>параметра является необязательным плюсом +, за которым следует ссылка на источник <src>, затем двоеточие :, а затем ссылка на назначение <dst>.
Выбирается удаленная ссылка, которая соответствует <src>, и, если <dst>не пустая строка, локальная ссылка, которая соответствует ему, быстро пересылается с помощью<src> . Если используется необязательный плюс+, локальный ref обновляется, даже если он не приводит к ускоренному обновлению.
Смотрите также
Git оформить заказ и слить, не касаясь рабочего дерева
Слияние без изменения рабочего каталога