由于推送后分支太晚,如何删除不应该成为分支一部分的提交?

How to remove a commit that shouldn't be a part of a branch due to branching too late after push?

我有一个分支代表一组与文件 XYZ 交互的更改。我决定开始研究与文件 ABC 交互的项目的另一个组件(例如,没有相互包含的文件)。错误地,我提交了更改然后分支而不是存储这些更改,所以现在对 XYZ 所做的工作意外地包含在第二个分支中。不幸的是,我已经将提交推送到该分支的远程版本。我试图在下面制作图表:

            /-G--H  # second branch
        /--E  # first branch
-A--B--C

我的意思是这样的:

        /--G--H # second branch
-A--B--C
        \--E # first branch

第二个分支已经推送 git push -u origin second-branch

“搬”支线没问题;签出第二个分支并将其变基,从 E 之后开始,到提交 C.

所以从这个情况来看:

* cb796d8 (HEAD -> second) H
* 0bc85b6 G
* d2c6ff8 (first) E
* ba28890 (master) C
* 41598db B
* 625c73b A

我就说

git rebase --onto master first second

很快,我知道了:

* a305755 (HEAD -> second) H
* 18ebe9f G
| * d2c6ff8 (first) E
|/  
* ba28890 (master) C
* 41598db B
* 625c73b A

但是,当您尝试推送结果时,您会 运行 遇到麻烦;你可能不得不使用武力,因为当你试图改变历史时,远程不喜欢它,如果你在这些分支上与其他人合作,你将不得不警告他们你将要做什么。

首先你需要变基:

git checkout second-branch
git rebase --onto C E

这会将 E 之后的所有提交移动到 C 之上。

现在推送你的分支:

git push --force