1

我最近分叉了一个项目,在提交了几十次之后,我注意到我想从文件中删除一些敏感信息。虽然想要删除它,要么只撤消我对该文件的提交,并将更改作为一个重做,要么可能替换一个文本字符串,但我找到了 BFG。我跑的是:

bfg --replace-text replacements.txt -fi file .

然后是 BFG 输出所建议的 'git reflog expire...'。在强制推送到远程之后,我的 fork nows 说:

This branch is XXX commits ahead, XXX commits behind …:master.

现在撤消可能为时已晚,除非我想重新分叉并将我的更改添加为一次提交。有什么解决办法吗?

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

无效 BFG 使用后 Git 合并重复

git log 没有显示任何错误,但是使用其他应用程序,我看到整个历史记录对于每个提交都有重复。Github Desktop 还显示了两个分支,master 和 originalproject/master,我记得它之前只显示了 master。我对 git 的了解还不够,无法弄清楚下一步。使用日志中的提交 ID 尝试 git reset --hard master xxxx 说“无法使用路径进行硬重置”。

4

1 回答 1

1

要了解造成这种情况的原因,您需要了解在 Git 中重写历史的后果。BFG 是一个重写 Git 提交的工具,因此你的项目历史。

Git 通过提交哈希跟踪提交。提交哈希是从许多事物中计算出来的——父提交哈希、repo 中的内容(树哈希)、作者、提交者、提交的日期/时间、提交消息等。如果其中任何一个发生变化,例如文件内容,父提交,然后在清理期间重写该提交时,提交哈希将更改。从您重写的第一个此类提交开始,每个后续提交都会有所不同并具有不同的散列,无论它是否被重写,因为父散列将与该点向前不同。

在从上游存储库克隆/分叉的存储库世界中,Git 可以通过比较常见/新提交(哈希)来判断分歧发生在哪里。由于您在克隆中重写了历史记录,因此它现在从您重写的第一个提交点与上游不同。这就是 Git 在解释前面/后面的分支时告诉您的内容。

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

正如 Jonathan.Brink 的评论中所建议的那样,您最好的选择是将清理后的提交重新设置为最年轻的共同父提交。

于 2016-03-04T04:32:56.903 回答