2014-04-20 164 views
2

我发现一年前我有一个文件承诺回到我的回购站,而我从来不想去那里。 在我公开发布我的repo之前,我想要还原或实际删除引入此文件的提交,以便任何人都无法访问此文件。从git历史记录中删除提交

我用过交互式rebase,所以我可以删除不需要的提交。它看起来很有前途,但是在应用800次800次提交之后,就会发生冲突。

冲突是由非线性历史造成的 - 在两个分支中都有一个分支和一个文件被修改(让我们说feature1和feature2)。据我注意到git rebase试图使这个平行历史线性,并在这些平行,相互冲突的修改失败。我不想尝试解决这个问题,因为还有更多这样的情况,并且修复所有这些问题将是一个很大的努力。

所以我的问题是:是否有可能简单地删除一个提交重建分支历史没有任何影响其他提交?

我的文件被添加了一次,从未被修改,所以没有其他提交触摸它。

+2

相关:[从Git历史记录中删除敏感文件及其提交](http://stackoverflow.com/q/872565/456814),[如何从Git存储库中的提交历史中删除/删除大文件?](http://stackoverflow.com/q/2100907/456814),[从所有Git存储库提交历史中完全删除文件](http://stackoverflow.com/q/307828/456814),[从git中删除文件资源库(历史)](http://stackoverflow.com/q/2164581/456814)。 –

+0

默认情况下,'git rebase'不保留合并提交。但是,[您可以通过使用' - '来告诉 它尝试保留合并提交](https://www.kernel.org/pub/software/scm/git/docs/git-rebase.html#_options) preserve-merges'或 '-p'标志。我不确定这是否会重新应用先前提出的冲突解决方案。 –

回答

2

你可以试试filter-branch命令。

git filter-branch --prune-empty --tree-filter 'rm <filename-to-delete> || true' HEAD 

如果错误提交刚刚添加的文件删除,整个提交将被跳过(选项--prune空)。

我已经用一个分支和合并的简单回购测试了这个,并且合并很巧妙地保留了下来。所以你不应该期待冲突。先生,filter-branch也创建了一个备份分支。 :-)

相关问题