简短的回答
只要你在做一个快进合并,然后你可以简单地使用
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
While 安布尔的回答也适用于快进情况,使用git fetch
这种方式比仅仅强制移动分支引用更安全,因为git fetch
只要您不使用,就会自动防止意外的非快进+
在参考规范中。
长答案
如果不先检出 A,则无法将分支 B 合并到分支 A,否则会导致非快进合并。这是因为需要工作副本来解决任何潜在的冲突。
然而,在快进合并的情况下,这是可能的,因为根据定义,此类合并永远不会导致冲突。要在不先签出分支的情况下执行此操作,您可以使用git fetch
带有参考规格。
这是更新的示例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>
如果您想允许非快进更新,那么您添加+
到参考规范的前面:
git fetch <remote> +<remoteBranch>:<localBranch>
请注意,您可以使用以下命令将本地存储库作为“远程”参数传递.
:
git fetch . <sourceBranch>:<destinationBranch>
文档
来自git fetch解释此语法的文档(强调我的):
<refspec>
的格式<refspec>
参数是可选的加号+
,后跟源参考<src>
,后跟一个冒号:
,后跟目的地参考<dst>
.
匹配的远程引用<src>
已获取,并且如果<dst>
不是空字符串,匹配它的本地引用使用快进<src>
。如果可选加+
使用时,即使不会导致快进更新,也会更新本地引用。
See Also
-
Git 签出和合并而不触及工作树
-
合并而不更改工作目录