删除分支上的Git提交

时间:2012-02-27 20:54:08

标签: git git-rebase git-subtree

如何删除分支为master的提交?

我已经通过Git subtree将一个大型库以及一个非常丰富的提交历史记录(并且在我的代码之前)添加到子目录中。我想追溯整个历史记录,但仍然可以在新提交中合并到库

我尝试了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

1 个答案:

答案 0 :(得分:1)

  1. 这是历史编辑。你最终会得到像

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

  3. 实际上你需要

    1. 重置为B(为G创建标记或分支以保持其周围)
    2. --no-commit合作。
    3. Rebase或cherry-pick G here(将是G')
    4. 历史记录看起来像

      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. 删除reflog: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)。

      10. 要迁移到子模块解决方案(可能是最佳选项),您需要回滚到合并之前的状态并设置子模块,然后用更改的commit-id替换每个合并用于子模块。与case of splitting out project directory to submodule不同,我不知道自动解决方案(但它可以以类似的方式实现)。