简短回答
只要你进行的是快进合并,那么你可以简单地使用
git fetch <remote> <sourceBranch>:<destinationBranch>
例子:
git fetch . foo:master
git fetch origin foo:foo
虽然Amber的回答在快进情况下也可以起作用,但是这种方式使用git fetch
比强制移动分支引用要安全一些,因为只要在refspec中不使用+
,git fetch
会自动防止意外的非快进操作。
详细解答
如果没有首先检出A分支,就将B分支合并到A分支并导致非快进合并,则需要工作副本来解决潜在的冲突,因此这是不可能的。
然而,在快进合并的情况下,这是可能的,因为根据定义,这样的合并永远不会导致冲突。要在不首先检出分支的情况下执行此操作,可以使用带有refspec的git fetch
。
以下是一个示例,如果您检出了另一个分支feature
,则更新master
(禁止非快进更改):
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>
参数的格式是可选的加号+
,后跟源引用<src>
,再后跟冒号:
,再后跟目标引用<dst>
。
匹配<src>
的远程引用被获取,如果<dst>
不为空字符串,则使用<src>
快进匹配的本地引用。 如果使用可选的加号+
,则即使不导致快进更新,也会更新本地引用。
另请参阅
不触及工作树的Git checkout和merge
合并而不更改工作目录
--no-ff
选项合并,这将导致合并提交被记录。如果您对此感兴趣,我的答案展示了如何做到这一点 - 不像我在这里发布的答案那样强大,但两者的优点肯定可以结合起来。 - Cascabel