如何从分支中间删除提交

How to remove a commit from the middle of a branch

我做了一些提交并将其推送到我的远程仓库。其中一个我想删除。它仅包含一个二进制文件,该文件仅在该分支的该提交中发生更改。如何在不损害以后提交的情况下删除它?

您可以使用 interactive (-i) rebase 删除之前的提交。

$ git log                          # copy the target commit 

$ git rebase -i <target-commit>~1  # start rebase from the previous commit of target commit

编辑器将打开一个提交列表,每行一个。每行都以 pick 开头。 注释掉你的目标提交行(将#放在目标提交行的开头)。

或者,输入 dropd 而不是用 #.

注释掉该行
$ git rebase --continue      # repeat the command until finish rebase

现在,您需要强制 (-f) 推送到远程,因为 git 历史记录已更改!

$ git push -f origin HEAD 

标志 --rebase-merges 应该在答案中考虑,因为接受的解决方案将删除 HEAD 和目标提交之间的合并提交~1

示例:

Before any rebase:

f3e07b4 (HEAD -> dev, origin/dev) headCommit
dd3d182 Merged PR 425: added playoutServerUsage
7ed3eb5 added playoutServerUsage
03b52af feat: add Description Series  #targetCommit
0a1217c some_older_commit

git rebase -i target-commit~1

c11fa07 (HEAD -> dev) headCommit
7ed3eb5 added playoutServerUsage
0a1217c some_older_commit

git rebase -i target-commit~1 --rebase-merge

a1943b6 (HEAD -> dev) headCommit
12411a1 Merged PR 425: added playoutServerUsage
7ed3eb5 added playoutServerUsage
0a1217c some_older_commit

Rebase with flag --rebase-merges can be harder and whole process will bo longer (bigger tree), but still we have to locate target commit and change 'pick' to 'drop'

之后我会推荐使用

git push --force-with-lease origin HEAD 

改为仅强制。

force vs force-with-lease

PS。值得关注的是更改了哪些提交哈希