4

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

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

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

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

AFAIK,至少有两种方法可以实现这一目标:

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

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

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

4

3 回答 3

1

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


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
于 2013-06-20T15:14:12.663 回答
0

我会尝试类似的东西:

git checkout -b new_X X
git rebase -i A # set everything to 'squash'
git checkout master
git rebase --preserve-merges --onto new_X X

希望这应该保持提交更改相同,因此会有冲突。如果这失败了,我可能会求助于低级命令git commit-tree和一些脚本来从原始树创建新结构。

于 2013-06-20T13:01:39.237 回答
0

编辑:此解决方案将从存储库中删除旧提交(包括其中所做的任何更改)。这显然不是操作员所要求的,但无论如何我都会将答案留给未来的读者。


git checkout master
git rebase --onto A X~

我不能保证不会有冲突,但如果你遇到任何冲突,你可以手动解决它们,git add有冲突的文件,然后键入git rebase --continue.

git rebase或者,您可以通过在 A (或之前)中所做的任何冲突更改之上应用最近的更改来强制自动解决任何冲突:

git checkout master
git branch backup # Just to be safe
git rebase -s theirs --onto A X~
git branch -D backup # When you're sure master has everything you need
于 2013-06-20T13:34:29.800 回答