Краткий ответ
Пока вы выполняете ускоренное слияние, вы можете просто использовать
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 оформить заказ и слить, не касаясь рабочего дерева
Слияние без изменения рабочего каталога