【问题标题】:Split one branch into two in Git在 Git 中将一个分支一分为二
【发布时间】:2021-03-16 20:27:40
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您想追溯地使 git 存储库的历史更复杂?为什么?那有什么好处呢?这听起来像是XY Problem
  • @JoachimSauer Ha,我不知道它有什么名字。但我不认为这里是这种情况,我的 X 问题实际上只是在基础知识之外学习 Git。至于让历史更复杂,是的,真实,但也更有条理。也许我永远不会使用它,但我认为我会从我从中获得的理解中受益。
  • 我怀疑你真正想要的是 DH 留在新的开发分支中,新的合并提交 D'AD 作为父母)和H'(以D'G 作为父母)。 (我现在注意到@matt 在他的回答中或多或少做了什么。)
  • @chepner 是的,我得出了同样的结论......
  • @chepner 你说得对,谢谢。

标签: git git-rewrite-history


【解决方案1】:

您的图表毫无意义;你不能移动 D,例如,你画它的方式。此外,如果没有其他人在master 上工作,那么在您绘制的master 上进行单独的合并提交是没有意义的,因为它可以快进到跟随develop

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

  1. 创建一个分支develop,但不要检查它。

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

  3. 你在master仍然。合并 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

...这正是你所说的你想要的那种东西。

【讨论】:

  • 差不多了,谢谢。就像我说的,我只是想学习 Git,我认为这让我明白了一些我以前没有得到的东西。
猜你喜欢
  • 1970-01-01
  • 2012-09-03
  • 2011-05-27
  • 2013-04-03
  • 2017-02-21
  • 2021-08-09
  • 2010-12-15
  • 2020-06-03
  • 2022-01-11
相关资源
最近更新 更多