我在本地Git存储库中有~50次提交。我对当前HEAD中的特定文件进行了一些更改,我想将这些文件更改更新为所有以前的提交。有可能在git中实现这个吗?
答案 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
命令与更新索引更加纯粹相关,所以在这里可能是更好的选择。