在git历史记录中更改文件内容

时间:2019-09-03 19:14:49

标签: git rebase

我需要在500次提交之前修改一次提交中文件的内容。到目前为止,我已经尝试了一个交互式的rebase会话和一个git filter-branch,运气不佳。

我的rebase似乎进展顺利,但是我更改的文件中的行在从rebase进行的每个后续选择中都产生了冲突,导致我必须解决500多个实际上完全相同的合并冲突。 (也许我不在这里做某事)

我也尝试过:

git filter-branch --tree-filter "echo mytextIwanttoinsert > My/file/path" -- --all

这运行了一段时间,最终似乎没有任何效果。

对此最好的策略是什么?它是git过滤分支吗?我做错了什么,阻止了更改的发生?

2 个答案:

答案 0 :(得分:2)

正如其他人在评论和答案中提到的那样:您要问的结果是删除历史记录中的所有提交并创建新的提交,这将影响克隆您的存储库(如果有)的人。


您发布的git filter-branch命令可在我的系统上使用,并在所有提交中正确替换目标文件的内容。

如果您需要更多帮助:请提供更多有关无效方法的详细信息。


关于git rebase和重复的冲突解决方案:

要让git在遇到完全相同的冲突时自动重新应用您验证过的分辨率,可以打开git rerere

git config --global rerere.enabled true

此功能主要是被动功能:您只需将其打开,然后再出现以前解决的冲突时,git会自动应用与初始解决方案相同的补丁。

您可以在this link上阅读该文档,discussion部分提供了其工作方式的说明。

答案 1 :(得分:0)

通常您不需要进行这样的思考,或者至少,我想知道为什么您需要进行类似的事情。

这是一个可能的解决方案(git中可能总是有很多解决方案)。

假设您在分支机构master上执行了以下操作:

git touch myFile
git add myFile
git commit -m "First commit. A file myFile added."

# write "Line 1" on the first line of myFile
git add myFile
git commit -m "Line 1 added to myFile."

# write "Line 3" on the second line (note we forgot Line 2)
git add myFile
git commit -m "Line 3 added to myFile."

# and a last time with "Line 4"
git add myFile
git commit -m "Line 4 added to myFile."

现在,您无法更改提交。但是您可以用另一种替换提交。在此示例中,我们要删除添加了Line 3的提交,并用添加了Line 2Line 3的提交替换它。可以按照以下步骤进行操作:

git checkout -b commits_to_recover # a branch with origin at the commit where we added "Line 4"
git reset --hard HEAD~2 # go back to the commit where we added Line 1
# myFile has now only "Line 1". Add "Line 2" and "Line 3". Then:
git add myFile
git commit -m "Line 2 and Line 3 added."

现在,我们只需要合并commits_to_recover上的分支master。您可以先在commits_to_recover上使master变基础,然后再进行合并。当然,您必须解决冲突。

git checkout commits_to_recover
git rebase master # and solve conflicts
git checkout master
git merge commits_to_recover

您可以跳过变基部分而只需执行以下操作:

# we are on master
git merge commits_to_recover # and solve conflicts

如果结果令人满意,您可以删除分支commits_to_recover并按遥控器上的master

git branch -d commits_to_recover
git push -f origin master

注意:您也可以git cherry-pickLine 4上提交master,而不使用commits_to_recover策略。