Краткий ответ
Пока вы выполняете слияние fast-forward , вы можете просто использовать
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
будетавтоматически предотвращать случайные не-быстрые пересылки, если вы не используете +
в ссылке.
Длинный ответ
Вы не можете объединить ветку B с веткой A без проверкиВо-первых, если это приведет к слиянию без ускоренной перемотки вперед.Это связано с тем, что для разрешения любых потенциальных конфликтов необходима рабочая копия.
Однако в случае слияний с ускоренной пересылкой возможно , поскольку такие слияния никогда не приводят к конфликтам,по определению.Чтобы сделать это без предварительной проверки ветки, вы можете использовать git fetch
с refspec.
Вот пример обновления master
(запрещение изменений без ускоренной перемотки вперед), если у вас есть другая ветка feature
checked:
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>
Если вы хотите разрешить обновления без ускоренной перемотки, то вы добавляете +
в начало refspec:
git fetch <remote> +<remoteBranch>:<localBranch>
Обратите внимание, что вы можете передать свое локальное репо в качестве параметра "remote", используя .
:
git fetch . <sourceBranch>:<destinationBranch>
Документация
Из документации git fetch
, которая объясняет этот синтаксис (выделено мной):
<refspec>
Формат <refspec>
parameter является необязательным плюсом +
, за которым следует источник ref <src>
, затем двоеточие :
, за которым следует пункт ref <dst>
.
Удаленный refвыбирается значение, совпадающее с <src>
, и если <dst>
не является пустой строкой, локальная ссылка, соответствующая ему, быстро пересылается с использованием <src>
.Если используется дополнительный плюс +
, локальная ссылка обновляется, даже если это не приводит к обновлению в ускоренном режиме.
См. Также
Git оформить и объединить, не касаясь рабочего дерева
Объединение без изменения рабочего каталога