Fab-V упоминает ниже :
git merge master -s recursive -X renormalize
</ul>
<hr>
<p><a href="https://stackoverflow.com/users/245966/jakub-g">jakub.g</a> also <a href="/674365/vozmozhno-li-dlya-git-merge-ignorirovat-razlichiya-v-kontse-strokicomment41273803_862920">comments</a> that the <strong>strategies work also with cherry-picking</strong>: </p>
<pre><code>git cherry-pick abcd123456 --strategy=recursive --strategy-option=renormalize
</code>
Это работает намного лучше, чем ignore-all-space
.
Оригинальный ответ (май 2009 г.)
Патч для игнорирования стиля eol был предложен в June 2007 , но он касается только git diff --ignore-space-at-eol
, а не git merge
.
В то время был задан вопрос:
Должен ли --ignore-space-at-eol
быть опцией для git-merge
?
Слияния - это то, где эта функциональность имеет значение.
Какова семантика автоматического разрешения слияния с этими действующими параметрами - используются ли они только для обнаружения переименования, или мы, например, не помечаем конфликты только изменениями пробелов? А если нет, какую версию мы принимаем автоматически?
Хулио Хамано не был в восторге:
Это, конечно, заманчиво, но я подозреваю, что это следует оставить на более поздние раунды.
Я подозреваю, что это представило бы концепцию двух различных типов различий, один из которых должен обрабатываться механически (то есть использовать в слиянии с "git-merge-recursive", и применяться с
"git-am") и еще один, который люди должны осмотреть, чтобы понять.
Часто может оказаться полезным выполнить входные данные в последнем случае, даже если результаты сравнения поддельных входных файлов могут быть нелегко использовать для механического применения.
Общая идея, когда дело доходит до git merge
, заключается в использовании стороннего инструмента слияния.
Например, я настроил DiffMerge как инструмент для слияния Git, установив ruleset , который позволяет этому инструменту слияния игнорировать eol для файлов определенного типа.
Установка в Windows, с MSysGit1.6.3, для сеансов DOS или Git bash, с DiffMerge или KDiff3:
- установить каталог в вашей 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:
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 и используется для имитации стиля 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, и вы сами увидите, какие строки фактически объединены, а какие игнорируются.
Предупреждение : файл результатов всегда будет в режиме Windows eol (CRLF) с DiffMerge ...
KDiff3 предлагает сохранить так или иначе.