简短的回答
只要您进行快进合并,您就可以简单地使用
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
虽然Amber 的答案也适用于快进的情况,但git fetch
以这种方式使用比仅强制移动分支引用更安全一些,因为git fetch
只要您+
不在参考规范。
长答案
如果不先检出 A,则不能将分支 B 合并到分支 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
for(非)快进合并的语法
如果您希望在fetch
更新是非快进的情况下命令失败,那么您只需使用表单的 refspec
git fetch <remote> <remoteBranch>:<localBranch>
如果要允许非快进更新,则+
在 refspec 的前面添加一个:
git fetch <remote> +<remoteBranch>:<localBranch>
请注意,您可以使用以下命令将本地存储库作为“远程”参数传递.
:
git fetch . <sourceBranch>:<destinationBranch>
文档
从git fetch
解释此语法的文档中(强调我的):
<refspec>
参数的格式<refspec>
是可选的加号+
,后跟源引用<src>
,后跟冒号:
,然后是目标引用<dst>
。
获取匹配的远程引用,<src>
如果<dst>
不是空字符串,则使用 快速转发匹配它的本地引用<src>
。如果使用可选加+
号,则更新本地 ref,即使它不会导致快进更新。
也可以看看
Git结帐和合并而不接触工作树
合并而不更改工作目录