将dev分支合并到master VS 将master分支合并到dev

3
我不确定如果我将主分支合并到开发分支会发生什么,接下来应该怎么做?我只需再次将开发分支合并到主分支吗?在这种情况下,主分支的头部是否只是简单地移动到F'合并提交? 在此输入图片描述

当你将主分支合并到开发分支时,开发分支会更新B、D提交的内容,但C、E的更改尚未合并到主分支。但是,如果你将开发分支合并回主分支,主分支将通过另一个合并提交更新C、E的内容。 - Rahul R.
主分支的头指针会直接移动到dev分支的合并提交处,而不是创建一个新的合并提交。 - weijia_yu
@rahulR. 这样正确吗? - weijia_yu
是的,这是正确的,Git 会更喜欢快进合并。除非你使用 --no-ff - evolutionxbox
1个回答

3

将主分支 -> 开发分支 -> 主分支合并不完全等同于开发分支 -> 主分支 -> 开发分支,差异微妙,不太可能影响您的代码,但在审核历史记录或撤消合并时可能会出现问题。

首先,这里有一些来自git的输出(使用git log --graph --oneline --decorate --branches),用于说明这些情况。

合并前:

* 4da7550 (dev) E
* d80d7a8 D
| * 5a5dde8 (HEAD -> master) C
| * 880a096 B
|/  
* 59903a3 A

将dev分支合并到master分支,然后将master分支合并回dev分支:
*   88bda7a (HEAD -> dev, master) Merge branch 'dev'
|\  
| * 4da7550 E
| * d80d7a8 D
* | 5a5dde8 C
* | 880a096 B
|/  
* 59903a3 A

将主分支合并到开发分支,然后将开发分支合并回主分支:
*   e0ef175 (HEAD -> master, dev) Merge branch 'master' into dev
|\  
| * 5a5dde8 C
| * 880a096 B
* | 4da7550 E
* | d80d7a8 D
|/  
* 59903a3 A

这里的主要区别在于每种情况下提交是相反的。在第一种情况下,主分支位于左侧,开发分支位于右侧。而在第二种情况下,则是相反的。
为什么会这样呢?
当你将一个分支合并到另一个分支时,git 会创建一个带有两个父提交的提交。第一个父提交将是你当前所在的分支,而第二个父提交将是要合并的分支。
我们首先将主分支合并到开发分支时,开发分支是父级1。当我们首先将开发分支合并到主分支时,主分支是父级1。
这有关紧要吗?
不特别重要,只要你意识到了就行。这通常不是问题,并且不会影响代码。它确实使您的 git 历史记录更难读取,在第二种情况下,我们在右侧有主分支,看起来好像开发分支是基本分支。
唯一的实际区别是,如果以后您决定犯了错误并想撤销开发分支的更改,则您的命令将会改变。
如果我首先将主分支合并到开发分支中,我将输入:
git revert -m 2 <merge commit ref>

如果我先将dev合并到master,我会输入以下命令:
git revert -m 1 <merge commit ref>

-m <n> 告诉Git撤消一个提交,并保留第n个父提交。

避免这种情况的一种方法是在合并到主分支时避免快进,使用--no-ff。这将创建另一个合并提交,其父提交按照正常顺序排列。

实际上没有必要将主分支合并到dev分支,除非您特别需要在继续工作时使用主分支中的更改。在这种情况下,您还应该期望在dev分支上有进一步的提交,而不仅仅是立即将其合并回主分支。


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