从以前的 git 分支中删除预先提交的提交

Remove prepended commits from previous git branch

在处理一个项目时,我们在分支之间切换时搞砸了同步。起初有一个功能分支 foo,它被重新设置为 master,但是,本地 master 没有同步,所以当移动到一个新分支时,bar,所有来自前一个分支的提交都被添加到前面也到新分支。 git 树看起来像这样:

Master =>  A--B--C--D--E--Merge
               \-C--D--E-/-F--G--H   <= Bar
                  Foo

我的目标是完全删除 foo,因为它已经重新设置为 master,并且有类似的东西:

Master =>  A--B--C--D--E
                        \-F--G--H    <=Bar

编辑:

看来这比我教的还乱。另外,我对 git 不是那么精通,甚至无法断定到底发生了什么。我现在将尽可能详细地介绍。

我和队友正在做一个项目。为了实现一项功能,我们创建了一个单独的分支 foo.

A -- B <-- (master)
      \
       C -- D -- E <-- (foo)

完成功能后,我将 foo 重新设置为 master。现在树看起来像这样:

A -- B -- C -- D -- E <-- (master)

需要实现新功能,因此新分支 bar 已打开。

A -- B -- C -- D -- E <-- (master)
                     \
                      F -- G -- H <-- (bar)

这一切都是我的责任。现在队友推送了他的代码,我猜他没有同步一些分支,还有一些需要合并的冲突,但最后,git 树是这样的:

A -- B -- C -- D -- E <-- (master)
      \             | \
       C -- D -------- M1 ------ M2 -- I <-- (bar)
                    \           /
                     F -- G -- H

其中:

此外,我对M2中的消息有点困惑,因为这意味着我们最后剩下foo,但我们的树只有bar.

我确实按照@Mark Adelsberger 的建议尝试了 运行 git rebase master bar,但是我在提交 C 时立即遇到了合并冲突,并且我中止了变基。根据答案,它应该自动确定这两个 C 是同一个提交,并跳过它们,但事实并非如此。

我的目标是尽可能压平树,意思是,在 bar 分支中删除 CD,并希望合并或放置 FGHM1M2I.

在同一行

回到问题上来,我发现我的第一个 post 缺少很多细节。希望这次编辑能澄清我面临的问题。

所以,虽然@Mark Adelsberger 的回答并没有完全解决它,但它确实为我指明了研究的方向。

做一个简单的 git rebase master bar 并没有成功,因为我 运行 在提交 C 时立即陷入冲突。这不应该发生,因为提交是重复的,应该被跳过。

但是,git rebase -i master bar 确实有帮助,因为我可以手动排除提交 CD。最重要的是,它还去掉了 M1M2,使日志变得漂亮干净。