【问题标题】:Removing Git commits on a branch删除分支上的 Git 提交
【发布时间】:2012-02-27 20:54:08
【问题描述】:

如何删除从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

【问题讨论】:

  • 合并将受到这种挤压的影响。你为什么要压扁它?只是为了清理 gitk/git 日志输出?
  • 是的,而且所有之前的提交都达到了几百兆字节。
  • 您通过将库的开发历史集成到项目存储库中来导入库的决定很奇怪。
  • 确定将其限制在最后一次提交会节省很多空间吗?
  • 为了更清晰的输出,您可以使用子模块。为了节省空间,您可以尝试以浅模式克隆该库。

标签: git git-rebase git-subtree


【解决方案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. 删除远程及其引用命名空间git remote rm
  4. 擦除引用日志: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 替换每个合并子模块。与case of splitting out project directory to submodule 不同,我不知道这个的自动化解决方案(但它可以以类似的方式实现)。

【讨论】:

  • 为什么E' 不能有F,而不是F',作为它的父级(F'G 也是如此)?
  • 提交编号 == 提交哈希。更改父级意味着更改此提交意味着更改此提交的哈希意味着更改此提交的编号。历史编辑会产生涟漪,将所有提交更改为最新的。
  • 这里(第 3 点)是执行您在问题中陈述的说明,但它会破坏合并。你还想要什么? 1. 确切的命令怎么做;或者2.如何切换到子模块的想法;或者 3. 如何让库被浅层克隆?
  • 谢谢@vi。我想我想浅层地克隆图书馆。我曾经将库作为子模块,但由于它似乎更易于管理(我错了!)而改为子树。我正在尝试使用各种 filter-branch 命令将其重新引入为子模块,但我想看看浅克隆需要什么。
猜你喜欢
  • 2022-10-15
  • 2020-09-08
  • 2014-03-23
  • 2017-01-24
  • 2020-07-29
  • 2014-09-29
  • 1970-01-01
  • 2018-12-05
  • 2023-04-03
相关资源
最近更新 更多