答案 0 :(得分:2)
你可以使用git fast-export
(在备份工作副本之后)做这种魔术:
在您的工作副本中运行git fast-export --no-data --all --full-tree > all_commits
。然后在文本编辑器中打开文件all_commits,并搜索“初始提交”。它周围的环境应如下所示:
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
放置对提交的引用以便稍后识别它,from
或merge
识别承诺的父母):
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
恢复原始提交,但在此操作之前创建备份并不是一个坏主意。
答案 1 :(得分:0)
你可以使用
git reset --hard HEAD~1
或
git reset --hard <sha1-commit-id>
如果你已经推了它
git push origin HEAD --force
答案 2 :(得分:0)
您可以通过重新定位要在最后一次有效提交之上保留的提交来完成。要查找要保留的提交,请创建两个分支tmp_1, tmp_2
。这两个分支的HEAD
将指向要保留的提交的端点。
现在,在最后一次有效提交的基础上重新提交这些提交。成功改造后强制重命名主人。
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
成功改造后,
git branch -f master tmp_3
删除其他分支。
答案 3 :(得分:0)
您可以使用以下命令恢复该提交: git revert&lt; Sha1&gt;