在 Git 中将一个分支分成两个

Split one branch into two in Git

我有一个完全线性历史的项目:

master    A – B – C – D – E – F – G – H

我想将它分成两部分:develop 包含大部分提交,master,其中 develop 仅在里程碑处合并:

master    A – – – D – – – – – H
           \     /           /
develop     B – C – E – F – G

你的图表没有意义;例如,您不能按照绘制的方式移动 D。此外,如果没有其他人在 master 上工作,那么在 master 上进行单独的合并提交就没有意义,因为它可以快速转发到 [=] 15=].

尽管如此,我们可以通过在历史的各个阶段强制存在合并提交来完成您描述的 一般 事情。好的,所以 master 目前在 H。我们开始:

  1. 创建一个分支develop但不要签出。

  2. 您还在 master。将 --hard 重置为 A(使用 SHA 编号)。所以现在 master 在 A,develop 变成 A-B-C-D-E-F-G-H。

  3. 你在 master仍然。 Merge D --no-ff(使用它的 SHA)以获得一个很好的合并提交。沿 develop 合并您认为有意义的中转点的任何其他地方。

  4. 结账 develop 并继续工作。

我来示范。我们有这个:

* ddb5eeb (HEAD -> master) f
* d995c3c e
* a1f5432 d
* b6c9729 c
* b15090c b
* ee1de04 a

现在:

$ git branch develop
$ git reset --hard ee1d
$ git merge --no-ff a1f5
$ git merge --no-ff develop
$ git checkout develop

现在我们有了这个:

*   2ad4bb2 (master) Merge branch 'develop'
|\  
| * ddb5eeb (HEAD -> develop) f
| * d995c3c e
* |   c6f43e4 Merge commit 'a1f5'
|\ \  
| |/  
| * a1f5432 d
| * b6c9729 c
| * b15090c b
|/  
* ee1de04 a

...这正是您所说的想要的东西。