将先前提交中的文件内容更改为当前数据

时间:2017-06-20 15:50:47

标签: git github gitlab

我在本地Git存储库中有~50次提交。我对当前HEAD中的特定文件进行了一些更改,我想将这些文件更改更新为所有以前的提交。有可能在git中实现这个吗?

1 个答案:

答案 0 :(得分:1)

UPDATE - 虽然原始答案中的命令有效,但在反射时它可能不是在索引过滤器中使用的最佳选项;添加了一些关于此

的评论

有可能,但有成本。

您所描述的是"历史重写",它将更改每次提交的提交ID。如果你一个人使用这个仓库,并且你没有使用任何提交ID(SHA)值(比如文档或其他),那么这可能就好了。

如果其他人也使用回购(或者如果您有多个克隆),则需要协调切换。基本上我的建议是安排所有更新都被推送到一个共同的仓库(可能是原产地),然后丢弃所有克隆,然后重写并替换原点,然后重新克隆。从技术上讲,你不必这样做,但看看"从上游的rebase恢复"在git rebase文档中(实际上适用于任何历史记录重写)。

因此,如果您决定继续重写,最简单的方法可能是使用git filter-branch。 (如果对您的回购的某些假设是正确的,那么基于rebase的方法可行;但filter-branch更普遍适用。)

git filter-branch --index-filter 'git reset master -- file/to/be/rewritten' -- --all

这会创建一些"备份"在您验证结果后,您将要删除的引用。

请注意,我最初建议

git filter-branch --index-filter 'git checkout master -- file/to/be/rewritten' -- --all

这似乎也有效;但是reset命令与更新索引更加纯粹相关,所以在这里可能是更好的选择。