如何删除项目的一部分';在Git中提交历史记录?

如何删除项目的一部分';在Git中提交历史记录?,git,git-rewrite-history,Git,Git Rewrite History,我一直在从事一个Git项目,该项目很快将与其他开发人员共享。我的项目中有一部分包含不允许共享的信息 如果我的项目历史看起来像A->B->C->D->E->F,并且提交C和D中包含的信息是私有的,那么在共享之前是否可以修改我的项目历史,使其看起来像A->B->E'->F'(其中E'和F'是没有机密信息的E和F) 我的理解是,如果我在F和B之间执行手动合并来创建F',那么最终提交将是我想要的,但它不会保留项目历史。我想它看起来会像A->B->F'而不是A->B->E'->F'。我相信你要找的是一个基

我一直在从事一个Git项目,该项目很快将与其他开发人员共享。我的项目中有一部分包含不允许共享的信息

如果我的项目历史看起来像A->B->C->D->E->F,并且提交C和D中包含的信息是私有的,那么在共享之前是否可以修改我的项目历史,使其看起来像A->B->E'->F'(其中E'和F'是没有机密信息的E和F)


我的理解是,如果我在F和B之间执行手动合并来创建F',那么最终提交将是我想要的,但它不会保留项目历史。我想它看起来会像A->B->F'而不是A->B->E'->F'。

我相信你要找的是一个基础

如果提交C和D是自包含的,也就是说,如果提交E和F不需要它们来干净地应用,这应该没问题

适当的语法是:

$ git rebase --onto B D F 
其中B、D和F是散列或对这些提交的引用


但是,如果这些提交已被推送到公共存储库,则在执行此操作时要小心,因为为已公开的提交重写历史记录通常是危险的,不鼓励这样做

实现这一点的方法既简单又复杂。下面是一个非常简单的方法,它可以让您轻松地
grep
diff查找麻烦的代码片段,以验证它们是否存在

创建要共享的新回购协议。(您可以将无历史记录的F'快照存储在其中并完成,除非您希望保留一些历史记录。)

在旧回购协议中使用
git格式补丁
,以存储/tmp中A、B、E',F'的差异


使用
git am
将这些差异应用于新回购。发布它。

有一个强大的工具,允许您删除敏感信息,而不管它引入了什么:BFG

BFG将允许您有选择地从回购历史记录中删除敏感信息。例如,您可以使用它删除错误添加到存储库中的文件。它还允许从存储库中的文件历史记录中删除特定字符串

与其他方法相比,BFG的优势在于它可以在不影响不受关注的提交的情况下过滤历史记录。但是,它将更改存储库中已存在的某些提交的提交ID。有关详细信息,请参阅常见问题解答。

可能重复的