我做了5个提交,其中我引用了一些变量FooObj
。然后我意识到FooObj
是错误的选择,并创建BarObj
。现在我想提交一个提交,它将字符串FooObj
的所有实例替换为BarObj
,仅在这5个提交中添加的行中。如何搜索并替换最后一次X提交中添加的行中的字符串?
我不能做一个搜索&取代整个代码库,因为FooObj
仍然在许多地方正确使用;它必须被本地化为那5个提交。
我可以做到这一点手动取代,但有没有一种自动化的方式?
我做了5个提交,其中我引用了一些变量FooObj
。然后我意识到FooObj
是错误的选择,并创建BarObj
。现在我想提交一个提交,它将字符串FooObj
的所有实例替换为BarObj
,仅在这5个提交中添加的行中。如何搜索并替换最后一次X提交中添加的行中的字符串?
我不能做一个搜索&取代整个代码库,因为FooObj
仍然在许多地方正确使用;它必须被本地化为那5个提交。
我可以做到这一点手动取代,但有没有一种自动化的方式?
您可以通过git diff --name-only HEAD~5
获取最近5次提交中的文件列表。然后,您可以将其转换为sed命令,以便用xargs
替换您的变量名称。
所以整个命令最终会寻找一些这样的:
git diff --name-only HEAD~5 | xargs sed -i 's/FooObj/BarObj/g'
这将导致在正确的文件你正在更新。验证更改是否正确,并且可以照常提交。
编辑
既然你只想线在你提交更改的方法不会是相当自动化,但你可以创建一个补丁修复线,并将其应用应导致的变化你要的那个。
http://www.thegeekstuff.com/2014/03/git-patch-create-and-apply/
您可以创建一个补丁文件,并通过应用它:
git diff HEAD~5 HEAD >> BarObjPatch.diff
//Edit the patch file to correct the changes.
//As noted in the comments, be careful as this will modify context lines
sed -i 's/FooObj/BarObj/g' BarObjPatch.diff //Can also edit file manually
git apply BarObjPatch.diff
这将导致你想要的改变。
感谢您试图回答我的问题,但我需要将搜索和替换本地化为在这5个提交中添加的行 - 而不是整个文件 - 因为在那些文件中存在很多“FooObj”总是在那里(并保持不变)。 – DBedrenko 2015-02-24 14:29:30
对不起,在阅读问题时,更新了应该导致所需更改的答案。 – Schleis 2015-02-24 15:02:51
但是不会''sed'命令也执行替换上下文行和删除行(行中以“ - ”开头的行)?我可以让'sed'搜索表达式只匹配以“+”开始的行,但随后的提交将在上下文中有我在前面的提交中插入的行。我想有没有一种自动化的方式来做到这一点... – DBedrenko 2015-02-24 15:12:45