2013年更新:
より最近のgitバージョンは、ストラテジーrecursive
とストラテジーオプションとのマージを使用して認証します(-X
):
git merge -s recursive -Xignore-space-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
か?
この機能が重要なのはマージです。
これらのオプションが有効になっている自動解決されたマージのセマンティクスは何ですか?それらは名前の変更の検出にのみ使用されますか?たとえば、空白の変更のみとの競合にフラグを立てませんか?そうでない場合、どのバージョンを自動的に受け入れますか?
フリオC浜野は熱狂的ではなかった。
これは確かに魅力的ですが、それは後のラウンドに任せるべきだと私は思います。
私はそれが2つの異なる種類の差分の概念を導入するのではないかと思います。1つは機械的に処理されます(つまり、 "git-merge-recursive"とのマージで使用され、 "git-am"で適用されます)。理解する人間。
変更された入力ファイルの比較からの出力が機械的アプリケーションに容易に使用できない場合でも、後者の場合は入力を変更することが役立つ場合があります。
一般的なアイデアgit merge
は、サードパーティのマージツールに依存することです。
たとえば、DiffMergeをGitマージ用のツールとして設定し、そのマージツールが特定のタイプのファイルのEOLを無視できるようにするルールセットを設定しました。
DOSまたはGit bashセッション用のMSysGit1.6.3を使用し、DiffMergeまたはKDiff3を使用する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コマンド:
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設定:
git config ---system core.autoCRLF=false
- 2つの行が同一(ただしそれらの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):
この時点で(「return」を非表示にします)、DiffMergeまたはKDiff3が開き、実際にマージされている行と無視されている行が表示されます。
警告:結果ファイルは常にDiffMergeを使用したWindows eolモード(CRLF)になります...
KDiff3は何らかの方法で保存を提供します。