如何从日志中删除一个“git commit”,就像它从未存在过一样。

13
我在其中一个提交中犯了一个错误。现在我想要完全删除这个提交,让它看起来从未存在过。我不想在日志中看到这个提交。
我尝试了这个问题(“如何删除一个'git commit'”)中的所有提示,但是我仍然可以在日志中看到这个提交。我该如何完全删除它?
-- 编辑 --
好吧,我没有提供完整的信息。Lily Ballard是正确的。
到目前为止,我还没有推送这个提交,它只存在于我的机器上。ouah的回答有效,使用以下命令:
git log

不会显示,但是命令是什么?
git reset --hard HEAD^

我的意思是“检出最后一次提交并将分支更改为此”,这样我就可以继续使用类似SmartGit的图形程序查看该提交。
--编辑2--
不,这是一个SmartGit的bug!!!提交确实消失了。我必须关闭日志窗口,然后再次打开。提交不再存在。

我可能错了,但我认为你做不到。 - zneak
@zneak:你可以这么做,但Rodrigo需要提供更多信息。这个提交是否已经被推送到任何地方?你是否关心从磁盘中删除有关此提交及其文件的所有信息,或者只需确保它不在git log中显示(并且可以在以后的某个时间点自然地进行垃圾回收)? - Lily Ballard
尝试在此https://dev59.com/E3NA5IYBdhLWcg3whuV_中使用提示。 - Shraddha
2个回答

16
如果它是最后一次提交。
git reset --hard HEAD^

如果它不是最后一次提交

git rebase -i commit_hash^

打开编辑器,删除包含提交的整行内容,保存并退出。

请注意,如果分支已经被推送,重写历史记录或变基通常是不明智的,您可能更喜欢使用其他方法。

git revert commit_hash

这将添加一个新的提交,撤销提交 commit_hash


3
如果你想要删除单个提交,你也可以使用git rebase --onto $SHA1^ $SHA1(其中$SHA1是要删除的提交)。但需要注意的是,这种方法不能复制合并信息。如果想要尝试复制合并信息,可以加上-p标志,但是如果要删除的提交对于任何合并解决方案产生影响,则可能无法正常工作。另外,请注意不要混合使用-p-i(请参阅git-rebase手册中的BUGS部分)。 - Lily Ballard
@ouah 你可能应该提到,如果这个分支已经被推送了,那么这是一个坏主意。 - Richard
git revert. 是最好的解决方案 =) - Arthur Neves
如果你想将此提交推送到远程分支,那么在执行“git reset HEAD^ --hard”之后,请执行“git push <remote> -f”。 - Vignesh PT

5
这个命令(注意,它会重写历史):
git rebase --onto commitHash^ commitHash

(@ouah的解决方案对我没有用,反而Lily的有用。但是他的解决方案不应该作为评论,而应该像这样成为一个答案。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接