如何让Git将未修改的代码行标记为删除后重新添加?
让Git将代码块整体识别为删除后新增的方案
问题场景
原提交的代码:
if(x) { //do something }
修改后的代码:
while(x) { //do something else }
Git默认只会识别第一行(if(x)→while(x))和第三行(注释内容变更)为删除/新增行,中间的{和末尾的}会被判定为未改动。但需要让Git把这四行全部识别为删除后重新添加,试过添加无意义空格、分两次提交、Git自带的四种diff算法都无法满足需求。
可行方案
交互式暂存手动调整hunk
把修改后的代码替换完成后,执行git add -N <文件名>将文件标记为待追踪,接着运行git add -p <文件名>进入交互式暂存模式。在出现hunk选择界面时,输入e进入编辑模式,把原代码的四行都加上-前缀,新代码的四行都加上+前缀,保存退出后,Git就会将整个块识别为删除后新增。临时修改格式再合并提交
先给{和}行临时添加唯一标识的注释(比如{ // temp-mark和} // temp-mark),提交这个修改;然后再替换if为while、修改注释内容并删掉临时标记,提交第二次修改。最后用git rebase -i HEAD~2将两次提交合并为一个,最终提交不会留下临时注释的痕迹。自定义Git diff规则
在项目根目录创建或修改.gitattributes文件,添加规则:*.c diff=blockdiff然后在
.git/config中添加自定义diff配置:[diff "blockdiff"] xfuncname = "^(if|while)\("这个规则会让Git把以
if(或while(开头的代码块(直到对应}结束)视为一个整体单元进行diff,从而将整个块识别为变更。
内容的提问来源于stack exchange,提问作者Ben Jasperson
相关产品推荐
相关产品推荐

