将主分支 -> 开发分支 -> 主分支合并不完全等同于开发分支 -> 主分支 -> 开发分支,差异微妙,不太可能影响您的代码,但在审核历史记录或撤消合并时可能会出现问题。
首先,这里有一些来自git的输出(使用git log --graph --oneline --decorate --branches
),用于说明这些情况。
合并前:
* 4da7550 (dev) E
* d80d7a8 D
| * 5a5dde8 (HEAD -> master) C
| * 880a096 B
|/
* 59903a3 A
* 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 revert -m 2 <merge commit ref>
git revert -m 1 <merge commit ref>
-m <n>
告诉Git撤消一个提交,并保留第n个父提交。
避免这种情况的一种方法是在合并到主分支时避免快进,使用--no-ff
。这将创建另一个合并提交,其父提交按照正常顺序排列。
实际上没有必要将主分支合并到dev分支,除非您特别需要在继续工作时使用主分支中的更改。在这种情况下,您还应该期望在dev分支上有进一步的提交,而不仅仅是立即将其合并回主分支。
--no-ff
。 - evolutionxbox