2010-09-10 248 views

回答

2

听起来像你想git filter-branch

但是,请务必考虑该名男子页上的警告:

警告!重写的历史记录 对于所有的 对象具有不同的对象名称,并且不会与 原始分支会聚。 不会是 能够在 原始分支的顶部轻松推送并分发 重写的分支。如果您不知道 的全部含义,请不要使用 此命令,并且无论如何只要简单的单一提交 就足以解决您的问题,无论如何不要使用 。 (请参见“恢复上游 REBASE”的混帐底垫(1) 更多信息有关改写 公布的历史部分。)

手册页的"Examples"部分显示了如何卸下历史的给定文件。这对你来说应该是一个很好的起点。

假设你想从所有 提交删除文件 (包含机密信息的 或侵犯版权):

git filter-branch --tree-filter 'rm filename' -- --all

+0

谢谢,这看起来正是我所需要的。原谅无知,但是在这个例子中HEAD是我想要删除的版本号? – Alexander 2010-09-10 15:35:58

+0

@Alexander:HEAD指定要重写哪个参考历史。该示例试图从HEAD的所有祖先中删除“坏”文件(在该示例本身后面描述)。 – wRAR 2010-09-10 15:40:29

+0

这个例子实际上不会重写任何分支。如果你真的想要重写所有的分支,你可以用' - --all'来代替'HEAD'。 – Cascabel 2010-09-10 18:15:22

0

如果你真的不想要删除从历史的承诺,如Tim Henigan所说,filter-branch就是要走的路。然而,他从manpage引用的警告有很好的理由,很可能你会找到另一种解决方案。

要扭转单一的影响提交,你可以简单地使用:

git revert <commit>  # that's the SHA1 hash of the commit 

这将创建一个新的提交,在当前的分支,它反转指定的所有更改的顶部提交。

相关问题