【发布时间】:2011-03-26 22:29:43
【问题描述】:
假设我们有一个存储库和 5 个提交:
- 提交 1
- 提交 2
- 提交 3
- 提交 4
- 提交 5
现在我意识到提交 4 和 5 是个坏主意。我想完全删除提交 4 和 5 中提交的所有更改。怎么做?
【问题讨论】:
-
如果您已推送到公共存储库,我会选择还原。否则任何其他选项都可以。
标签: git
假设我们有一个存储库和 5 个提交:
现在我意识到提交 4 和 5 是个坏主意。我想完全删除提交 4 和 5 中提交的所有更改。怎么做?
【问题讨论】:
标签: git
git revert commit_hash
它恢复给定的提交。请注意,revert 是另一个提交,它丢弃来自 commit_hash 的更改,而不是从存储库中删除给定的提交。
【讨论】:
我可能会从提交 3 创建一个新分支。
git checkout -b commit3
然后从该提交中变基主控
http://git-scm.com/docs/git-rebase
当然,您正在使用主题分支将您的开发分支分开,直到您知道它们是一个好主意,对吧?
【讨论】:
如果提交 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 进行更改。
【讨论】:
git gc" 具有误导性——它会自动调用自己,用户通常不需要运行它。提交也不会被视为不可访问,只要它在 reflogs 中,这需要 90 天才能过期。即使您删除了分支(以及它的引用日志),默认情况下也只会修剪超过 30 天的对象。结果:它不会很快消失。