Git合并时如何为单个文件应用recursive策略的ignore-space-at-eol选项?
解决合并过程中单个文件的换行符冲突问题
你遇到的问题很常见——当已经处于未提交的合并会话中时,直接用git merge指定单个文件和策略是行不通的,因为Git已经在处理分支合并的流程里了。不过别担心,我们可以用git merge-file这个专门处理单个文件三方合并的工具来搞定它,步骤如下:
重置目标文件的合并状态
既然你已经用git checkout -m myfilewithconflicts.txt撤销了该文件的合并,现在它应该回到了未解决冲突的状态。如果还没执行这条命令,先跑一下确保文件回到合并前的待处理状态:git checkout -m -- myfilewithconflicts.txt准备合并所需的三个版本文件
Git的三方合并需要三个核心版本:共同祖先版本、当前分支(branch1)的版本、要合并的分支(branch2)的版本。我们可以直接从Git仓库导出这三个版本到临时文件:# 导出共同祖先版本 git show $(git merge-base branch1 branch2):myfilewithconflicts.txt > ancestor.txt # 导出当前分支(branch1)的版本 git show HEAD:myfilewithconflicts.txt > current.txt # 导出branch2的版本 git show branch2:myfilewithconflicts.txt > other.txt用指定策略合并单个文件
现在用git merge-file执行合并,加上-Xignore-space-at-eol来忽略换行符差异,-L参数可以给三个版本命名,方便后续查看冲突(可选但推荐):git merge-file -L branch1 -L "common ancestor" -L branch2 -Xignore-space-at-eol current.txt ancestor.txt other.txt执行后,
current.txt就是合并完成的文件,Git会自动处理换行符相关的冲突。替换原文件并标记冲突解决
把合并好的文件替换掉工作区的原文件,然后加入暂存区,告诉Git这个文件的冲突已经解决:mv current.txt myfilewithconflicts.txt git add myfilewithconflicts.txt清理临时文件
最后删掉我们刚才创建的三个临时文件:rm ancestor.txt other.txt
这样操作后,这个文件就按照你想要的策略完成合并了,你可以继续处理其他文件,最后提交整个合并结果即可。
内容的提问来源于stack exchange,提问作者Artyom
相关产品推荐
相关产品推荐

