2013年更新:
较新的git版本授权使用带有策略合并recursive
和策略选项(-X
):
git merge -s递归-Xignore-at-eol
但是也可以使用“ -Xignore-space-change
”
jakub.g还评论说该策略也适用于摘樱桃:
git cherry-pick abcd123456 --strategy=recursive --strategy-option=renormalize
效果比更好ignore-all-space
。
原始答案(2009年5月)
已经在2007年6月提出了忽略eol风格的补丁,但是它只是涉及git diff --ignore-space-at-eol
,而不是git merge
。
当时,这个问题已经提出:
应该--ignore-space-at-eol
是一个选择git-merge
吗?
合并是此功能很重要的地方。
具有这些选项的自动解析合并的语义是什么-它们仅用于重命名检测,还是我们(例如,仅标记空格更改而不标记冲突)?如果我们不接受,我们会自动接受哪个版本?
Julio C Hamano并非完全热情:
这当然很诱人,但我怀疑应该留待以后的回合。
我怀疑它会引入两种不同的差异的概念,一种进行机械处理(即与“ git-merge-recursive”合并使用,并与“ git-am”结合使用),另一种将由人类了解。
即使比较比较杂乱的输入文件的输出对于机械应用而言可能不容易使用,但为后一种情况调整输入通常可能很有用。
谈到时,通常的想法git merge
是依靠第三方合并工具。
例如,我将DiffMerge设置为Git合并的工具,并设置了一个规则集,该规则集允许该合并工具忽略某些类型文件的eol。
在Windows上使用DiffMerge或KDiff3使用MSysGit1.6.3在DOS或Git bash会话上进行安装:
- 在您的PATH中设置目录(此处:)
c:\HOMEWARE\cmd
。
- 在该目录中添加脚本merge.sh(您最喜欢的合并工具的包装器)
merge.sh:
#!/bin/sh
# Passing the following parameters to mergetool:
# local base remote merge_result
alocal=$1
base=$2
remote=$3
result=$4
if [ -f $base ]
then
#"C:/Program Files/SourceGear/DiffMerge/DiffMerge.exe" "$alocal" "$base" "$remote" -m --result="$result" --title1="Mine" --title2="Merging to: $result" --title3="Theirs"
# for merge respecting eol, KDiff3 is better than DiffMerge (which will always convert LF into CRLF)
# KDiff3 will display eol choices (if Windows: CRLF, if Unix LF)
"C:/Program Files/KDiff3/kdiff3.exe" -m "$base" "$alocal" "$remote" -o "$result"
else
#there is not always a common ancestor: DiffMerge needing 3 files, BASE will be the result
#"C:/Program Files/SourceGear/DiffMerge/DiffMerge.exe" "$alocal" "$result" "$remote" -m --result="$result" --title1="Mine" --title2="Merging to: $result" --title3="Theirs"
# KDiff3 however does know how to merge based on 2 files (not just 3)
"C:/Program Files/KDiff3/kdiff3.exe" -m "$base" "$remote" -o "$result"
fi
Git配置命令:
git config --global merge.tool diffmerge
git config --global mergetool.diffmerge.cmd "merge.sh \"$PWD/$LOCAL\" \"$PWD/$BASE\" \"$PWD/$REMOTE\" \"$PWD/$MERGED\"
git config --global mergetool.diffmerge.trustExitCode false
git config --global mergetool.diffmerge.keepBackup false
git config在系统级别:
git config ---system core.autoCRLF=false
- 测试,当两行相同(但它们的eol字符)相同时,DiffMerge或KDiff3在合并过程中都将忽略这些行。
DOS脚本(注意:dos2unix命令来自此处,用于模拟Unix eol风格。该命令已复制到此答案开头提到的目录中。):
C:\HOMEWARE\git\test>mkdir test_merge
C:\HOMEWARE\git\test>cd test_merge
C:\HOMEWARE\git\test\test_merge>git init
C:\HOMEWARE\git\test\test_merge>echo a1 > a.txt & echo a2 >> a.txt
C:\HOMEWARE\git\test\test_merge>git add a.txt
C:\HOMEWARE\git\test\test_merge>git commit -m "a.txt, windows eol style"
C:\HOMEWARE\git\test\test_merge>git checkout -b windows
Switched to a new branch 'windows'
C:\HOMEWARE\git\test\test_merge>echo a3 >> a.txt & echo a4 >> a.txt
C:\HOMEWARE\git\test\test_merge>git add a.txt
C:\HOMEWARE\git\test\test_merge>git commit -m "add two lines, windows eol style"
C:\HOMEWARE\git\test\test_merge>git checkout master
C:\HOMEWARE\git\test\test_merge>git checkout -b unix
Switched to a new branch 'unix'
C:\HOMEWARE\git\test\test_merge>echo au3 >> a.txt & echo au4 >> a.txt && echo au5 >> a.txt
C:\HOMEWARE\git\test\test_merge>dos2unix a.txt
Dos2Unix: Processing file a.txt ...
C:\HOMEWARE\git\test\test_merge>git add a.txt
C:\HOMEWARE\git\test\test_merge>git commit -m "add 3 lines, all file unix eol style"
[unix c433a63] add 3 lines, all file unix eol style
C:\HOMEWARE\git\test\test_merge>git merge windows
Auto-merging a.txt
CONFLICT (content): Merge conflict in a.txt
Automatic merge failed; fix conflicts and then commit the result.
C:\HOMEWARE\git\test\test_merge>git ls-files -u
100644 39b4c894078a02afb9b1dfeda6f1127c138e38df 1 a.txt
100644 28b3d018872c08b0696764118b76dd3d0b448fca 2 a.txt
100644 3994da66530b4df80189bb198dcfac9b8f2a7b33 3 a.txt
C:\HOMEWARE\git\test\test_merge>git mergetool
Merging the files: a.txt
Normal merge conflict for 'a.txt':
{local}: modified
{remote}: modified
Hit return to start merge resolution tool (diffmerge):
此时(命中“返回”),DiffMerge或KDiff3将打开,您将自己看到实际上合并了哪些行,而忽略了哪些行。
警告:使用DiffMerge,结果文件将始终处于Windows eol模式(CRLF)...
KDiff3提供了一种或多种保存方式。