Git:是否有类似于hg strip的功能?

28

我有一个仓库,在其中进行了更改,导致合并困难,我想要假装它从未存在过。这是一个长而复杂的故事,涉及将一个已存在的仓库与通过git-p4更新的仓库拼接在一起,但要点是我真的非常希望Git能够假装某个特定的更改从未存在过。

如果使用的是Mercurial,我相信可以通过hg strip来解决我的问题,但在Git中找不到这样的命令。

感谢任何您可能提供的建议。

3个回答

35

你需要执行多个命令。正如其他人所提到的那样,第一个是git reset。你需要找到要删除的修改集之前的变更集,并使用它。

git reset --hard <changeset>

这将更改当前分支头(和索引)以指向该变更集,但“坏的”变更集仍然存在。如果您进行推送,它将不会被包括在内,但如果您克隆本地存储库,则会包含它,并且仍然可以在日志和检出命令中引用它。

假设没有其他对其的引用(例如后续提交、标签等),那么您可以使用以下方法清理它:

git gc --prune=now

我在http://help.github.com/remove-sensitive-data/上找到了这个命令,该网站还提到(就像hg strip一样),如果您已将"错误"的变更推送到远程位置,则无法使用常规git命令删除它,但您需要采取其他步骤来删除和重新创建服务器上的存储库并清理任何缓存页面。


4

正如larsks所说的那样git reset --hard可以帮助您返回到想要的历史版本:

  1. 使用git log查找正确的sha值。
  2. 运行git reset --hard sha来返回。

2
尝试阅读git reset的文档。我对Mercurial不是很熟悉,但如果我正确理解这个文档,那么git reset将让您做同样的事情--即将存储库重置回其历史记录中的先前点。 此文档详细讨论了reset命令,而此文档简要讨论了更正错误的不同选项。

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