Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 如何在上次X提交中添加的行中搜索和替换字符串?_Git_Sed_Replace - Fatal编程技术网

Git 如何在上次X提交中添加的行中搜索和替换字符串?

Git 如何在上次X提交中添加的行中搜索和替换字符串?,git,sed,replace,Git,Sed,Replace,我做了5次提交,其中引用了一些变量FooObj。然后我意识到FooObj是错误的选择,于是创建了BarObj。现在,我想进行一次提交,仅在这5次提交中添加的行中,将stringFooObj的所有实例替换为BarObj 我无法对整个代码库进行搜索和替换,因为FooObj在许多地方仍然正确使用;必须将其本地化为这5个提交 我可以手动进行替换,但是否有自动方式?您可以通过git diff--name only HEAD~5获取最近5次提交中的文件列表。然后,您可以将其导入一个sed命令,用xargs替

我做了5次提交,其中引用了一些变量
FooObj
。然后我意识到
FooObj
是错误的选择,于是创建了
BarObj
。现在,我想进行一次提交,仅在这5次提交中添加的行中,将string
FooObj
的所有实例替换为
BarObj

我无法对整个代码库进行搜索和替换,因为
FooObj
在许多地方仍然正确使用;必须将其本地化为这5个提交


我可以手动进行替换,但是否有自动方式?

您可以通过git diff--name only HEAD~5获取最近5次提交中的文件列表。然后,您可以将其导入一个sed命令,用
xargs
替换变量名

所以整个命令最终会看到这样的东西:

git diff --name-only HEAD~5 | xargs sed -i 's/FooObj/BarObj/g'
这将导致为您更新正确的文件。验证更改是否正确,并且可以像往常一样提交更改

编辑

由于您只希望在提交中更改行,因此该方法不会完全自动化,但您可以创建修补程序来修复行并应用它,这将导致您想要的更改

您可以创建修补程序文件并通过以下方式应用它:

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
,这些文件一直存在(并且应该保持不变)。很抱歉,在阅读问题时忽略了这一点,更新了答案,这将导致您想要的更改。但是,
sed
命令不也会对上下文行和删除的行(在差异中以“-”开头的行)执行替换吗?我可以使
sed
搜索表达式只匹配以“+”开头的行,但随后的提交将在上下文中包含我在前一次提交中插入的行。我想没有一种自动化的方法可以做到这一点…不是用git中的一个命令,不是。但是需要进行修复应该只是偶尔发生的事情。如果您经常需要更正变量名,我认为您需要检查您的工作流程……我的意思是,即使使用一些命令行也不行。我无法想象如果不写一个完整的脚本怎么能做到。
git diff HEAD~5 HEAD > original.patch
cp original.patch modified.patch
sed -i 's/^+\(.*\)FooObj/ \1BarObj/g' modified.patch
git apply --reverse original.patch
git apply modified.patch