Git如何从项目分支中删除commit记录?

4

所以,我在 Github 上 fork 了一个项目,并做出了两次提交。我也将这些提交推送到了我的 fork。

与此同时,上游项目也有两次提交。

假设在 fork 的时候,两个分支都位于 A 头部

A

然后,我做了两次提交 B 和 C,并将它们推送到了我的 fork 中

A - B - C

上游项目做了 D 和 E 两个提交

A - D - E

在我的克隆库中,我从上游获取了代码,因此状态为

A - D - E
  \ 
    B - C

然后我执行了一个变基操作,状态变为

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

现在,我希望在我的分支中,不再存在D和E,而且头部指向E'。只有我一个人使用我的分支。
我查看了这里的几个其他答案,但没有看到有关多个头部(E和E')的问题。
2个回答

4
你所省略的是你的图片里的“refs”——分支和标签(以及远程分支引用,还可能有其他一些东西)。
当你进行变基时,如果你已经检出一个分支(或在变基开始时指定检出一个分支),默认行为是将被检出的分支引用移动到重写的提交上。原始提交始终存在;但是如果没有引用仍然指向它们,则默认日志输出不会显示它们。
然而,肯定仍然有一个引用指向它们:你重写的分支的远程分支引用。当你推送更新到源时,这将得到纠正。这将需要一个“强制”推送(`git push -f`),但由于你是该仓库的唯一用户,所以这并不重要。
如果其他分支仍然指向原始提交,则可以使用 `git reset` 将它们移动到新提交上。
git checkout branch
git reset <new-commit-id>

如果分支指向其他可达到原始提交的提交,那么这些提交也必须被重写。这是一个更大的话题,如果适用,请告诉我们。
同样地,如果标签指向原始提交,您可以移动它们(git tag -f ...)。

你是对的。我现在检查了标签,upstream/master 在 C,origin/master 在 E,在我的本地,head 和 master 在 E'。请注意,D'和E'没有被推送。当我尝试使用 git push -f 时,git 抛出了 fatal: You are not currently on a branch. To push the history leading to the current (detached HEAD) state now, use git push origin HEAD:<name-of-remote-branch>。最后我想要的是让我的 origin/master 在 E',并且让 D 和 E 消失。如果我理解你的意思正确的话,D 和 E 将始终存在,但不会出现在日志中? - Sundeep
你觉得 git -f push origin HEAD:master 是实现这个的正确方式吗? - Sundeep
1
我会检查你想要推送的分支,然后只需使用 git push -f(假设你通常只使用 git push)。但是有很多方法可以做到这一点,你的偏好可能与我的不同。 - Mark Adelsberger
在我的情况下(主分支),上述命令的强制推送起作用了。Github 在提交历史中也只显示了 D' 和 E' 提交,我相信这是来自 log 命令,就像你解释的那样没有显示提交 D 和 E。 - Sundeep

1

如您所述,您有一个分叉的分支——让我们称其为“Origin”,处于A-B-C状态(假设它被推送到您的Origin)。现在主分支(称其为“upstream”)有一些更改A-D-E,所以您需要做的是从upstream拉取代码,如果您使用Eclipse或本地,您将拥有您的代码(A-B-C ++ D-E),如果没有任何冲突,则将其推送到您的Origin分支,这样您的存储库就会同步,然后您也可以为您的更改(B-C)提交拉取请求。

现在您的Upstream即主分支和您的Origin即Forked分支是相等的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接