简短答案
只要您要进行快速合并,就可以使用
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
只要您不在分支机构中使用,它就会自动防止意外的非快进+
。 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
for(非)快进合并的语法
如果您希望该fetch
命令在更新不快速的情况下失败,那么您只需使用以下形式的refspec
git fetch <remote> <remoteBranch>:<localBranch>
如果要允许非快进更新,则+
在refspec的前面添加一个:
git fetch <remote> +<remoteBranch>:<localBranch>
请注意,您可以使用以下命令将本地存储库作为“远程”参数传递.
:
git fetch . <sourceBranch>:<destinationBranch>
文档资料
从git fetch
解释该语法的文档中(重点是我的):
<refspec>
<refspec>
参数的格式是可选的加号+
,其后是源ref <src>
,然后是冒号:
,然后是目标ref <dst>
。
将<src>
获取匹配的远程引用,如果<dst>
不是空字符串,则使用对其进行快速转发<src>
。如果使用了可选的加号+
,则本地引用会更新,即使它不会导致快速转发更新也是如此。
也可以看看
Git检出并合并而不触及工作树
合并而不更改工作目录