2010-09-10 319 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 

這將創建一個新的提交,在當前的分支,它反轉指定的所有更改的頂部提交。