可以撤销提交吗?

时间:2010-08-08 11:33:16

标签: git

假设我们有一个存储库和5个提交:

  • commit 1
  • commit 2
  • commit 3
  • commit 4
  • commit 5

现在我意识到提交4和5是一个坏主意。我想完全删除在提交4和5中提交的所有更改。如何做?

3 个答案:

答案 0 :(得分:6)

如果提交4和5仅在您的存储库中,并且没有被任何其他存储库推送或拉动,您可以简单地:

  

git reset --hard SHA1_HASH_OF_COMMIT_3

您可以使用git log找出提交的SHA1哈希,或者您可以使用更高级的命名技术,请参阅git help rev-parse,特别是“指定修订”部分。

使用此命令将使分支提示无法访问提交4和5。但是,这些提交不会丢失,因为这些提交保存在分支的reflog中。您可以使用git reflog来标识无法访问的提交。然后可以使用另一个git reset --hard进行恢复。这个页面here很好地描述了这一点。

建议您定期运行git gc;一些命令也会自动为您执行此操作。这基本上在存储库上执行“内务处理”,例如“压缩文件修订(以减少磁盘空间和提高性能)并删除无法访问的对象”。在(默认值)30天后,无法访问的对象将从存储库中删除。可以使用配置选项gc.reflogExpireUnreachable更改此内容。

答案 1 :(得分:5)

git revert commit_hash

它会恢复给定的提交。请注意,revert是另一个提交,它会从commit_hash中删除更改,而不是从存储库中删除给定的提交。

答案 2 :(得分:3)

我可能会从commit 3创建一个新的分支。

git checkout -b commit3

然后从该提交中修改主数据

http://git-scm.com/docs/git-rebase

当然,你正在使用主题分支来保持你的开发分支,直到你知道它们是个好主意,对吧?