2013 년 업데이트 :
최신 git 버전은 전략 recursive
및 전략 옵션 ( -X
) 과 병합을 사용하여 권한을 부여합니다 .
git merge -s 재귀 -Xignore-space-at-eol
하지만 " -Xignore-space-change
"를 사용 하는 것도 가능합니다
jakub.g 또한 코멘트 한다는 전략 체리 따기와도 작동 :
git cherry-pick abcd123456 --strategy=recursive --strategy-option=renormalize
이보다 훨씬 잘 작동합니다 ignore-all-space
.
원래 답변 (2009 년 5 월)
eol 스타일을 무시하기위한 패치는 2007 년 6 월 에 제안 되었지만 git diff --ignore-space-at-eol
, 그다지 중요 하지는 않습니다 git merge
.
당시 질문이 제기되었습니다.
해야 --ignore-space-at-eol
하는 옵션이 될 git-merge
?
병합은이 기능이 중요한 부분입니다.
자동 해결 병합의 의미는 실제로 해당 옵션과 함께 적용됩니다. 이름 바꾸기 감지에만 사용됩니까, 아니면 공백 변경만으로 플래그 충돌이 발생하지 않습니까? 그렇지 않으면 어떤 버전을 자동으로 수락합니까?
Julio C Hamano는 정확히 열광적이지 않았습니다.
확실히 유혹적이지만, 나중의 라운드로 가야한다고 생각합니다.
나는 그것이 두 가지 다른 종류의 diff의 개념을 도입 할 것으로 의심합니다. 하나는 기계적으로 처리되어야합니다 (즉, "git-merge-recursive"와 병합하여 사용하고 "git-am"으로 적용). 인간은 이해합니다.
Munged 입력 파일을 비교 한 결과를 기계 적용에 쉽게 사용할 수는 없지만 후자의 경우 입력을 조정하는 것이 종종 유용 할 수 있습니다.
일반적인 아이디어 git merge
는 타사 병합 도구를 사용하는 것입니다.
예를 들어, DiffMerge 를 Git 병합을위한 도구로 설정하고 해당 병합 도구가 특정 유형의 파일에 대한 eol을 무시하도록 규칙 세트 를 설정했습니다 .
DysMerge 또는 KDiff3을 사용하여 DOS 또는 Git bash 세션에 대해 MSysGit1.6.3을 사용하여 Windows에서 설정 :
- 디렉토리를 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 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
- autoCRLF가 false인지 확인하십시오.
시스템 레벨에서의 git config :
git config ---system core.autoCRLF=false
- 두 줄이 동일하지만 eol 문자 인 경우 DiffMerge 또는 KDiff3은 병합 중에 해당 줄을 무시합니다.
DOS 스크립트 (참고 : dos2unix 명령은 here 이며 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는 한 가지 방법으로 저장하도록 제안합니다.