在不检出分支的情况下合并分支

42

我有3个分支。

     master [ Live Server]
      \
       stage [ Stage Server Where we test changes; merge commits ]
        \ 
         Dev [ Local Machine ]

我想将更改下游。这些分支都设置为互相跟踪。

通常,要向下游传递更改,我会执行以下操作:

git checkout stage && git merge master

然后我检出dev并执行相同的操作

git checkout dev && git merge stage

然后全部推送:

git push origin --all

有没有一种方法可以在不检出每个分支的情况下向下游传递这些更改?

我可能使用了错误的术语。 我不确定是否完全正确地使用了上游/下游术语。


1
你对downstream的使用与我对“upstream/downstream”的理解不矛盾。https://dev59.com/QHE85IYBdhLWcg3whD3j#2749166 - VonC
4
可能是Merging Branches Without Checkout的重复问题。 - krlmlr
可能是Git checkout-and-merge without touching working tree的重复问题。 - user456814
重新添加:可能是不使用检出合并、更新和拉取Git分支的重复内容。 - hakre
显示剩余10条评论
3个回答

73
你确实可以将分支B合并到分支A中,而无需检出分支A,但前提是这是一个快进式合并。
你可以使用一个refspec和fetch来执行这个“合并”。如果使用git merge将分支B合并到分支A中会导致一个快进式合并,那么你可以按照以下步骤执行,而无需检出A:
git fetch <remote> B:A

文档

上述内容匹配refspec格式。

git fetch <remote> <source>:<destination>

来自git fetch的文档(我强调):

匹配<src>的远程引用将被提取,如果<dst>不是空字符串,则使用<src>快速向前推进匹配它的本地引用。

另请参阅

  1. 在不影响工作目录的情况下,使用Git checkout和merge

  2. 不使用checkout合并、更新和拉取Git分支

  3. 在不改变工作目录的情况下合并代码

  4. 不需要checkout合并分支


12
你可以使用点号代替远程名称来操作本地分支。 - David
这真是个好发现。我曾经匆忙地在文档中浏览过几次,但从没注意到这一点。 - Carrie Kendall
@CarrieKendall 这真的很容易被忽略。虽然已经过了很长一段时间,但我想我发现这个问题的唯一原因是因为我的 bash 自动完成了 refspec,出于好奇心,我决定按下回车键看看会发生什么... - user456814
5
这是一个实际的例子:git fetch . foo:master,无论你在哪个分支上,它都会将foo快进合并到master分支。.表示本地代码仓库。 - Jason Axelson

17

@chrisjlee请接受这个答案,因为它被隐藏在已接受的答案下面,而且还有赏金,很容易错过。git-forward-merge也在README中说明,如果可能的话,它会使用现在已经被接受的方法。 - Jiří Brabec

6

通常情况下,如果你没有将分支检出,就无法将其合并。然而,这是有充分理由的。你需要正确的工作树来标记和解决合并冲突。


这不是一个新的评论,只是编辑掉了我的答案链接,因为事后看来,像那样链接到自己的答案是不得体的。编辑后的评论:这并不完全正确。如果合并会导致快进合并,则不会有冲突,因此没有必要拥有工作副本,因此可以在不必检出目标分支的情况下进行合并。 - user456814

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接