gpt4 book ai didi

git - 删除分支上的 Git 提交

转载 作者:太空狗 更新时间:2023-10-29 13:03:40 25 4
gpt4 key购买 nike

如何删除从 master 分支出来的提交?

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

我尝试了 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. 这是历史编辑。你最终会得到类似的结果

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

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

    1. 重置为 B(为 G 创建标签或分支以保留它)
    2. 使用 --no-commit 执行 merge 。
    3. 在这里 rebase 或挑选 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. 清除引用日志:git reflog expire --expire=now --all
  5. 实际从 git 中删除东西:git gc --prune=now。现在您应该看到存储库缩小了。
  6. 重新添加库的 Remote 。
  7. git fetch --depth=10 libraryremote
  8. 重复 merge (通常的方式)
  9. 应用保存的提交(git am ~/saved_commits.patch)。

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

关于git - 删除分支上的 Git 提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9472116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com