Git 从项目分支中删除提交

Git Remove commits from a project fork

所以,我在 Github 上分叉了一个项目,并进行了 2 次提交。我也将这些提交推送到我的叉子上。

同时,上游项目也有2次commit。

假设分叉时,两个分支都在头A

A

然后我做了两个提交 B 和 C 并将它们推入我的叉子

A - B - C

并且上游提交了 D 和 E

A - D - E

在我的 fork 克隆回购中,我从上游获取,所以状态是

A - D - E
  \ 
    B - C

然后我做了一个变基,使状态变为

A - D - E
  \ 
    B - C - D' - E'

现在,我想把它放在我的叉子里,这样 D 和 E 就不存在了,头在 E'。我是唯一一个用我的叉子的人。

我在这里检查了其他几个答案,但我没有看到任何具有多头(E 和 E')问题的问题。

您的图片中遗漏的是 refs - 分支和标签(以及远程分支引用,可能还有一些其他内容)。

当你变基时,如果你有一个分支检出(或指定在变基开始时检出一个分支),默认行为是将检出的分支引用移动到重写的提交中。原始提交始终存在;但如果没有引用仍然指向它们,默认日志输出将不会显示它们。

但是,一个 ref 肯定仍然指向它们:您重写的分支的远程分支 ref。当您将更新推送到源时,这将得到纠正。这必须是 "forced" 推送 (git push -f),但由于您是该存储库的唯一用户,所以这无关紧要。

如果其他分支仍然指向原始提交,您可以使用 git reset 将它们移动到新提交。

git checkout branch
git reset <new-commit-id>

如果分支指向可以从中访问原始提交的其他提交,那么这些提交也必须重写。这是一个更大的话题,所以请告诉我们它是否适用。

与标签类似,如果它们指向原始提交,您可以移动它们 (git tag -f ...)。

正如您所提到的,您有 - 您的分叉分支 - 让我们将其称为 'Origin' 在 A-B-C- 状态(假设它推送到您的 Origin),

现在 Main Branch(称之为 'upstream')几乎没有变化 A-D-E,所以你要做的是,从上游拉取代码,如果你使用的是 Eclipse/or Local,你将拥有你的代码(A-B-C ++ D-E)如果您没有任何冲突,请将其推送到您的 Origin 分支,这样您的回购将处于同步状态,然后您还可以为 B-C 的更改发出拉取请求,

现在你的 Upstream 是 main 分支,你的 Origin 是 Forked 分支。