2010-08-08 130 views
7

假设我们有一个仓库和5次提交:是否有可能撤销提交?

  • 承诺1
  • 承诺2
  • 提交3
  • 提交4
  • 提交5

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

+0

如果您推送到公共存储库,我会与恢复。否则任何其他选项都可以。 – xenoterracide 2010-08-09 06:01:32

回答

4

git revert commit_hash

它还原给出承诺。请注意,还原是另一种提交,它放弃commit_hash的更改,不从存储库中删除给定的提交。

3

我可能会创建一个新的分支从提交3

git checkout -b commit3 

,然后变基从主提交

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

当然

,你正在使用的特性分支,让您的开发分支分开,直到你知道他们是一个好主意,对吧?

6

如果犯4和5只在您的仓库,并没有被推向或拉其他任何版本库,你可以简单地说:

的git的复位 - 硬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进行更改。

+0

“,直到你运行'git gc'”是误导 - 它会自动调用,用户通常不需要运行它。提交也不会被视为无法访问,只要它在reflog中,这需要90天过期。即使您删除分支(并使用它的引用日志),默认情况下也只是修剪超过30天的对象。 Upshot:它不会很快消失。 – Cascabel 2010-08-08 18:44:50

+0

@Jefromi我同意,这是误导。道歉相当匆忙的答案。我更详细地更新了我的答案。 – 2010-08-09 18:00:27

相关问题