7

如何删除分支的提交master

我通过Git subtree添加了一个大型库,以及非常丰富的提交历史(并且早于我的代码)到子目录。我想追溯压缩整个历史记录,但仍然能够合并到 library 的新提交中

我尝试了各种组合,git rebase但我从未得到预期的结果 [*]。

我的存储库看起来像:

A---B-----------F---G master
               /
  ... C---D---E

我希望它看起来像:

A---B-----------F'--G' master
               /
              E'

或者:

A---B-------E'--F'--G' master

[*]:

  • git rebase --onto C E master
  • git checkout F; git rebase --onto C E master
4

1 回答 1

1
  1. 这是历史编辑。你最终会遇到类似的事情

    A---B-----------F'---G' master
                   /
                  E'
    
  2. 在此之后合并将成为一个问题,因为 Git 将无法在您的历史和图书馆的历史之间找到共同的父母。

  3. 要真正做到这一点,你需要

    1. 重置为 B(为 G 创建标签或分支以保留它)
    2. 与 执行合并--no-commit
    3. 在这里变基或挑选 G(它将是 G')

    历史看起来像

    A---B-----------F'---G'
    

要对库进行浅层克隆,您需要执行以下操作(警告:未经测试):

  1. 将提交从 F(不包括)到 G(包括)保存到补丁 ( git format-patch F --stdout > ~/saved_commits.patch)
  2. 重置为 B。确保没有指向 F、E 或 G 的分支
  3. 删除遥控器及其 ref 命名空间git remote rm
  4. 擦除 reflogs:git reflog expire --expire=now --all
  5. 实际上从 git: 中删除东西git gc --prune=now。现在您应该看到存储库缩小了。
  6. 重新添加库的遥控器。
  7. git fetch --depth=10 libraryremote
  8. 重复合并(通常的方式)
  9. 应用保存的提交 ( git am ~/saved_commits.patch)。

要迁移到子模块解决方案(可能是最好的选择),您需要回滚到合并之前的状态并设置子模块,然后用更改的提交 ID 替换每个合并子模块。与将项目目录拆分为子模块的情况不同,我不知道这个的自动化解决方案(但它可以以类似的方式实现)。

于 2012-02-27T21:55:14.740 回答