Pembaruan 2013:
Versi git terbaru mengotorisasi penggunaan gabungan dengan opsirecursive
strategi dan strategi ( ):-X
git merge -s rekursif -Xignore-space-at-eol
Tetapi menggunakan " -Xignore-space-change
" juga kemungkinan
jakub.g juga berkomentar bahwa strategi ini juga bekerja dengan memetik ceri :
git cherry-pick abcd123456 --strategy=recursive --strategy-option=renormalize
Ini bekerja lebih baik daripada ignore-all-space
.
Jawaban asli (Mei 2009)
Tambalan untuk mengabaikan gaya eol telah diusulkan pada Juni 2007 , tetapi itu hanya menyangkut git diff --ignore-space-at-eol
, bukan git merge
.
Pada saat itu, pertanyaan telah diajukan:
Haruskah --ignore-space-at-eol
menjadi pilihan git-merge
?
Penggabungan adalah tempat pentingnya fungsi ini.
Apa semantik dari gabungan yang diselesaikan secara otomatis dengan opsi-opsi yang berlaku - apakah mereka hanya digunakan untuk mengubah nama deteksi, atau apakah kita, misalnya, tidak menandai konflik dengan hanya perubahan spasi putih? Dan jika tidak, versi mana yang kami terima secara otomatis?
Julio C Hamano tidak terlalu antusias:
Ini tentu saja menggoda, tetapi saya curiga harus diserahkan pada putaran selanjutnya.
Saya menduga bahwa itu akan memperkenalkan konsep dua jenis diff yang berbeda, satu untuk diproses secara mekanis (yaitu digunakan dalam penggabungan dengan "git-merge-rekursif", dan menerapkan dengan "git-am"), dan yang lain untuk diperiksa oleh manusia untuk mengerti.
Seringkali mungkin berguna untuk melakukan input pada kasus yang terakhir, walaupun output dari membandingkan file input yang munged mungkin tidak mudah digunakan untuk aplikasi mekanis.
Gagasan umum, jika menyangkut git merge
, adalah untuk bergantung pada alat gabungan pihak ketiga.
Sebagai contoh, saya telah mengatur DiffMerge menjadi alat untuk Git merge, menetapkan seperangkat aturan yang memungkinkan alat gabungan tersebut mengabaikan eol untuk jenis file tertentu.
Setup pada Windows, dengan MSysGit1.6.3, baik untuk sesi DOS atau Git bash, dengan DiffMerge atau KDiff3:
- set direktori ke PATH Anda (di sini:)
c:\HOMEWARE\cmd
.
- tambahkan di direktori itu script merge.sh (wrapper untuk alat gabungan favorit Anda)
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
- Nyatakan bungkus gabungan Anda untuk Git
Perintah konfigurasi 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
- Periksa apakah autoCRLF salah
git config di tingkat sistem:
git config ---system core.autoCRLF=false
- Uji itu, ketika dua baris identik (tetapi karakter eolnya), baik DiffMerge atau KDiff3 akan mengabaikan baris tersebut selama penggabungan.
Script DOS (catatan: perintah dos2unix berasal dari sini , dan digunakan untuk mensimulasikan gaya Unix eol-style. Perintah itu telah disalin dalam direktori yang disebutkan di awal jawaban ini.):
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):
Pada titik ini (Memukul "kembali"), DiffMerge atau KDiff3 akan terbuka, dan Anda akan melihat sendiri baris mana yang sebenarnya digabung, dan baris mana yang diabaikan.
Peringatan : file hasil akan selalu dalam mode Windows eol (CRLF) dengan DiffMerge ...
KDiff3 menawarkan untuk menyimpan dengan satu atau lain cara.