Git 将文本替换为BFG,现在它显示我的fork前后有几百次提交

Git 将文本替换为BFG,现在它显示我的fork前后有几百次提交,git,bfg-repo-cleaner,Git,Bfg Repo Cleaner,我最近完成了一个项目,在提交了几十次之后,我注意到有一些敏感信息我想从文件中删除。当我想删除它时,我发现了BFG,方法是只撤消对该文件的提交,并将更改作为一个文件重新进行,或者可能替换一个文本字符串。我跑的是: bfg --replace-text replacements.txt -fi file . 然后按照BFG输出的建议,“git reflog expire…”。用力推到遥控器后,我的叉子上写着: This branch is XXX commits ahead, XXX commit

我最近完成了一个项目,在提交了几十次之后,我注意到有一些敏感信息我想从文件中删除。当我想删除它时,我发现了BFG,方法是只撤消对该文件的提交,并将更改作为一个文件重新进行,或者可能替换一个文本字符串。我跑的是:

bfg --replace-text replacements.txt -fi file .
然后按照BFG输出的建议,“git reflog expire…”。用力推到遥控器后,我的叉子上写着:

This branch is XXX commits ahead, XXX commits behind …:master.
现在撤销可能太晚了,除非我想重新工作并在提交时添加更改。有什么办法吗

编辑:我的情况与这里非常相似:


git日志没有显示任何错误,但是使用其他应用程序,我看到每个提交都有重复的历史记录。Github桌面还显示了两个分支,master和originalproject/master,我记得它以前只显示master。我对git的了解还不够,还不知道下一步该怎么做。尝试git重置——硬主机xxxx使用日志中的提交id表示“无法使用路径进行硬重置”。

要了解原因,您需要了解在git中重写历史的后果。BFG是一个重写Git提交的工具,因此可以重写项目历史

Git通过提交哈希跟踪提交。提交散列是根据许多内容计算出来的——父提交散列、repo中的内容(树散列)、作者、提交人、提交日期/时间、提交消息等。如果其中任何更改,例如文件内容、父提交,则在清理过程中重新写入提交时,提交散列将更改。从您重新写入的第一个这样的提交开始,每个后续提交都将不同,并且具有不同的哈希值,无论是否重写,因为父哈希值将与前一点不同

在从上游回购克隆/分叉的回购的世界中,Git可以通过比较公共/新提交(散列)来判断分歧发生在哪里。由于您在克隆中重写了历史记录,因此它现在从您重写的第一次提交点的上游发散。这就是Git在解释前面/后面的分支时告诉您的

如果您只重写您在自己的fork中所做的提交,因为您进行了fork,并且还没有合并,那么这不太可能是一个大问题。如果这不是真的,那么除非你能让上游回购重写它们的历史,否则你将永远有一个潜在的巨大分歧


正如Jonathan.Brink在评论中所建议的那样,最好的办法是将清理后的提交重新设置到最年轻的公共父提交上。

以交互方式将分支重新设置到分叉项目的主提交上,并将所有提交压缩为一个。我看不出问题。你把敏感信息上传到远程回购,现在你已经修复了?问题是,当你在塞满这些东西的时候,你的上游回购协议走得太远了吗?