从 git 中删除不是最后一次提交的提交

delete a commit from git which is not the last commit

假设我们有两个分支,master 和 local_branch 我在 my_branch 中有一些提交。我将所有提交推送到存储库,我们假设我使用时:

git log --pretty=oneline

将向我显示这些行:

c682f01 (origin/local_branch) add final changes.
1bad4de add some local changes 2.
ef7d35e add some local changes 1.
f719c75 temp commit!
f0dcf28 some local changes.
adc5be1 (origin/master, origin/HEAD, master) Add design decisions.
baf2ec8 Add some feature 1.
edd3e66 initial commit

假设我想从 local_branch.

中删除一个提交(临时提交)

我怎样才能在不破坏其他提交的情况下做到这一点?

哪种方法最好? 我可以用这个指令来做吗:

git rebase -i

我会将我的本地分支重置为 f0dcf28,cherrypick ef7d35e - c682f01,提交它们然后强制将它们推送到远程。 (许多 repos 设置为您不能强制推送到分支或至少不能强制推送到 master 分支。在这种情况下,您对临时提交无能为力)

git reset --hard f0dcf28
git cherry-pick my_branch~2 my_branch
git push -f

(请小心使用 forcepush - 我还没有真正测试过这个:Forcepush 会覆盖你的远程分支!)

你可以 git rebase -i f0dcf28。在编辑器中打开时,您应该会看到类似以下内容:

pick c682f01 (origin/local_branch) add final changes.
pick 1bad4de add some local changes 2.
pick ef7d35e add some local changes 1.
pick f719c75 temp commit!
pick f0dcf28 some local changes.

f719c75 temp commit!前面的pick修改为d,即

pick c682f01 (origin/local_branch) add final changes.
pick 1bad4de add some local changes 2.
pick ef7d35e add some local changes 1.
d f719c75 temp commit!
pick f0dcf28 some local changes.

将其保存在您的编辑器中并退出。您的提交现在应该被删除。 完成此操作后,您需要强制推送