我需要在500次提交之前修改一次提交中文件的内容。到目前为止,我已经尝试了一个交互式的rebase会话和一个git filter-branch,运气不佳。
我的rebase似乎进展顺利,但是我更改的文件中的行在从rebase进行的每个后续选择中都产生了冲突,导致我必须解决500多个实际上完全相同的合并冲突。 (也许我不在这里做某事)
我也尝试过:
git filter-branch --tree-filter "echo mytextIwanttoinsert > My/file/path" -- --all
这运行了一段时间,最终似乎没有任何效果。
对此最好的策略是什么?它是git过滤分支吗?我做错了什么,阻止了更改的发生?
答案 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 2
和Line 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-pick
在Line 4
上提交master
,而不使用commits_to_recover
策略。