【问题标题】:Is it possible to revoke commits?是否可以撤销提交?
【发布时间】:2011-03-26 22:29:43
【问题描述】:

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

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

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

【问题讨论】:

  • 如果您已推送到公共存储库,我会选择还原。否则任何其他选项都可以。

标签: git


【解决方案1】:

git revert commit_hash

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

【讨论】:

    【解决方案2】:

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

    git checkout -b commit3
    

    然后从该提交中变基主控

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

    当然,您正在使用主题分支将您的开发分支分开,直到您知道它们是一个好主意,对吧?

    【讨论】:

      【解决方案3】:

      如果提交 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 天的对象。结果:它不会很快消失。
      • @Jefromi 我同意,这是误导。为一个相当匆忙的答案道歉。我已经更详细地更新了我的答案。
      猜你喜欢
      • 2018-01-14
      • 1970-01-01
      • 2010-09-19
      • 1970-01-01
      • 2014-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多