删除合并到主分支的提交

Delete commit which is merged into main branch

如何删除这个紫色提交和 "Merge branch..." 提交。 我尝试使用 "git rebase -i HEAD~x" 但没有用。

你可以使用

git reset --hard HEAD~1

git reset --hard <sha1-commit-id>

如果你已经推送了它

git push origin HEAD --force

您可以通过将要保留在上次有效提交之上的提交变基来实现。为了找到要保留的提交,创建两个分支 tmp_1, tmp_2HEAD 这两个分支都将指向要保留的提交端点。

现在,将这些提交重新设置在最后一个有效提交的基础上。成功变基后强制重命名 master。

git checkout -b tmp_1
git checkout -b tmp_2 <sha-of-commit-after-merged-one>
git checkout -b tmp_3 <sha-of-commit-before-merged-one>
git rebase --onto tmp3 tmp_2 tmp_1

rebase成功后,

git branch -f master tmp_3

删除其他分支。

您可以使用以下命令还原该提交: git 还原 < Sha1 >

你可以用 git fast-export 做这种魔术(在你备份你的工作副本之后): 运行 git fast-export --no-data --all --full-tree > all_commits 在您的工作副本中。然后在文本编辑器中打开文件 all_commits,并搜索 "initial commit"。它周围的环境应该是这样的:

commit refs/heads/master
mark :110
author Foo Bar <foobar@example.org> 1462192582 +0100
committer Foo Bar <foobar@example.org> 1462192582 +0100
data 14
Initial Commit
deleteall
M 100644 b346ed4d2db0c8110fe3104bd155a413b878527c some/file

commit refs/heads/master
mark :111
author Foo Bar <foobar@example.org> 1462192582 +0100
committer Foo Bar <foobar@example.org> 1462192582 +0100
data 21
Merge branch 'master'
from :109
merge :110
deleteall
M 100644 b346ed4d2db0c8110fe3104bd155a413b878527c some/file
M 100644 4d9af842ccf23b883b234f5ae93d71f11fa285de some/other_file

commit refs/heads/master
mark :112
author Foo Bar <foobar@example.org> 1462192582 +0100
committer Foo Bar <foobar@example.org> 1462192582 +0100
data 14
Did some stuff
from :111
deleteall
M 100644 b346ed4d2db0c8110fe3104bd155a413b878527c some/file
M 100644 d6a0ad80d11b9d376c23d17300ce95d724d050e7 some/other_file

您通过删除提交块和调整引用来删除该提交(mark 放置对提交的引用以便稍后识别它,并且 frommerge识别提交的 parents):

commit refs/heads/master
mark :111
author Foo Bar <foobar@example.org> 1462192582 +0100
committer Foo Bar <foobar@example.org> 1462192582 +0100
data 21
Merge branch 'master'
from :109
deleteall
M 100644 b346ed4d2db0c8110fe3104bd155a413b878527c some/file
M 100644 4d9af842ccf23b883b234f5ae93d71f11fa285de some/other_file

commit refs/heads/master
mark :112
author Foo Bar <foobar@example.org> 1462192582 +0100
committer Foo Bar <foobar@example.org> 1462192582 +0100
data 14
Did some stuff
from :111
deleteall
M 100644 b346ed4d2db0c8110fe3104bd155a413b878527c some/file
M 100644 d6a0ad80d11b9d376c23d17300ce95d724d050e7 some/other_file

比您使用 git fast-import --force < all_commits 导入更改的流。在这个操作之后,有问题的提交就消失了。

当出现问题时,您可以使用 git fast-import --force < all_commits.backup 恢复原始提交,但在此操作之前创建备份是个不错的主意。