能否撤销提交?

8
假设我们有一个仓库和5次提交:
  • 提交1
  • 提交2
  • 提交3
  • 提交4
  • 提交5
现在我意识到提交4和5是个坏主意。我想完全删除提交4和5中提交的所有更改。应该如何操作?

如果你已经推送到公共仓库,我会选择还原(revert)。否则,其他选项都可以。 - xenoterracide
3个回答

6

git revert commit_hash

这个命令会撤销指定的提交。注意,撤销是另一个提交,它会丢弃来自commit_hash的更改,而不是从存储库中删除给定的提交。


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更改此设置。


“直到你运行git gc”是误导性的 - 它会自动调用,用户通常不需要运行它。只要提交在reflogs中,就不会被视为无法访问。reflogs需要90天才能过期。即使您删除了分支(以及其reflogs),默认设置也仅清除30天以上的对象。总之:它不会很快消失。 - Cascabel
@Jefromi 我同意,这是误导性的。对于匆忙回答表示歉意。我已经更新了我的答案,并加入了更多细节。 - Greg Sexton

3

我会从提交记录3创建一个新的分支。

git checkout -b commit3

然后从那个提交中重新设置主分支

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

当然,你正在使用主题分支将开发分支保持分离,直到确定它们是一个好主意,对吗?


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