从提交历史中移除孤立分支

3

问题

我有一个GitHub仓库与一些贡献者分享,拥有相对较长的提交历史记录。曾经试图将一个孤立分支合并到主分支中,但结果并不如预期。这次尝试的结果是自从这个合并之后,所有文件似乎都在此提交中被重新创建。提交历史树仍然保留,所以当时我并没有太关注它(我很高兴终于成功了这次合并)。

那时候我没有意识到的是,单个文件的历史记录并没有得到保存。例如这个例子:这个文件应该有一份历史记录可以追溯到2012年,但这个历史记录在2017年8月11日之后就不再显示了,因为我合并了孤立分支。

可能的解决方案?

如果我查看历史树,我可以看到这个流浪提交就像某种附录一样悬挂在那里,如下面图片中用绿色标出的部分。通常情况下,如果已经将提交推送到上游,就不能安全地使用rebase来重新定位提交,否则会给其他人带来混乱。但在这种情况下,是否可以合并或删除这个悬挂的提交,以便恢复单个文件的历史记录?或者还有其他解决方案可以安全地重新路由版本历史吗?

Git history tree


当您在本地运行 git log --all 命令时,难道不会看到整个历史记录(包括丢失的记录)吗? - smarber
@smarber 我可以通过 git log --all 命令查看整个历史记录,但是使用 git log -- [文件名] 命令时无法查看完整的文件历史记录。单个文件的历史记录被截断在孤儿节点处,早期的文件更改未被显示。这在浏览 GitHub 上的单个文件历史记录时会带来不便。 - MPA
1个回答

3
您应该只需将父项添加到孤儿提交中即可。(在上下文之外听起来很奇怪)首先,选择父项,然后使用git replace --graft替换提交。
git replace --graft b1fbc1d21933 de3df2f048c

请确保一切正常,git replace不会写入任何更改,但是现在在你的实例上应该都是好的。 您甚至可以使用命令检查新提交:

git for-each-ref

如果您已经恢复了历史记录并对结果感到满意,请使用以下命令将更改写入:
git filter-branch -- --all

并且强制推送你的新历史记录。

免责声明:我已经在您的存储库中进行了测试,它似乎运行良好,但我之前从未像这样做过,可能会产生意外的后果。


很好的建议,Lukas!我已经在我的本地仓库上尝试了它,它确实像你描述的那样工作。然而,我的主要担忧是这种方法是否安全地推送到上游(就像rebase在本地运行良好,但可能会破坏您的上游仓库)。你能对此发表评论吗? - MPA
由于历史已经改变,现有的所有分支都需要重新基于。但是文件中没有实际更改,所以这应该不成问题。您也可以在本地尝试并确保一切正常。我想不出还可能出错的事情,但同样我以前没有做过这件事情。 - lukas-reineke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接