git - 我怎样才能去掉几个旧的提交,但在 git 中保持所有其他提交不变?

标签 git

假设提交的结构如下所示:

                 B'---C'           X'
                /      \          / \
           A---B---C---D---...---X---Y---Z(master)

现在我需要去除 A 和 X 之间的所有提交,

                         X'
                        / \
                   A---X---Y---Z

AFAIK,至少有两种方法可以实现:

  • git rebase -i A
  • git branch -f new_branch A; git rebase --onto master X

但总有一些冲突需要我手动处理。

因为我只想清除 A 之后和 X 之前的所有提交,并且我不需要在每次提交后更改任何 git 跟踪结果(例如,新生成的提交 X 与旧的 X 提交共享相同的内容),有更简单的方法吗?

最佳答案

注意:此解决方案会将您想要“剥离”到 X 中的提交压缩,以便新的 X 提交和所有后续提交的文件都处于与现在完全相同的状态。如果这不是您想要的,请参阅我的 other answer .


git checkout -b temp A
git merge X --squash
git commit -C X # Create new x commit
git checkout master
git rebase --preserve-merges --onto temp X # Rebase onto new X commit (should produce no conflicts)
git -d temp

关于git - 我怎样才能去掉几个旧的提交,但在 git 中保持所有其他提交不变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17214168/

相关文章:

git-commit - 为什么在不推送 git 的情况下提交?

Git add 和 git commit 混淆

svn - git-svn:从非主分支恢复提交

Git 钩子(Hook) : Take action when a branch is advanced

c - 为什么从源代码编译时会有这么多相同的 git 可执行文件?

git - 是否可以构建 `git`,使安装目录和部署前缀不相同?

Git 分支模型实现

node.js - 修改示例 Hello World Node.js 代码在 Google Compute Engine 中未生效

git - VS 2015 自动切换到 GIT

git-svn 本地分支跟踪远程 svn 分支