2013 Güncellemesi:
Daha yeni git sürümleri strateji recursive
ve strateji seçeneğiyle birleştirme kullanma yetkisi verir ( -X
):
git merge -s özyinelemeli -xignore-space-at-eol
Ama " -Xignore-space-change
" kullanmak da bir olasılık
jakub.g da yorumlar bu stratejiler kiraz toplama ile de çalışır :
git cherry-pick abcd123456 --strategy=recursive --strategy-option=renormalize
Bu çok daha iyi çalışıyor ignore-all-space
.
Orijinal cevap (Mayıs 2009)
Eeo stilini göz ardı etme yaması Haziran 2007'de önerildi , ancak sadece endişe ediyor git diff --ignore-space-at-eol
, değilgit merge
.
O zaman soru soruldu:
Meli --ignore-space-at-eol
için bir seçenek olabilir git-merge
?
Bu işlevsellik önemli olan birleşmelerdir.
Geçerli olarak bu seçeneklerle otomatik olarak çözülmüş birleştirme semantikleri nelerdir - yalnızca yeniden adlandırma algılaması için mi kullanılıyorlar, yoksa yalnızca boşluk değişiklikleriyle çakışmaları mı işaretlemiyoruz? Ve eğer yapmazsak, hangi sürümü otomatik olarak kabul ediyoruz?
Julio C Hamano tam olarak hevesli değildi:
Bu kesinlikle cazip, ancak bunun daha sonraki turlara bırakılması gerektiğinden şüpheleniyorum.
Biri mekanik olarak işlenecek (yani "git-merge-özyinelemeli" ile birleşerek ve "git-am" ile uygulanacak iki farklı türden farklı bir kavram sunacağından şüpheleniyorum. insanlar anlamak için.
Munged girdi dosyalarının karşılaştırılmasından elde edilen çıktı, mekanik uygulama için kolayca kullanılamasa da, çoğu zaman ikinci durum için girişin sıkıştırılması yararlı olabilir.
Genel fikir, söz konusu olduğunda git merge
, üçüncü taraf birleştirme aracına güvenmektir.
Örneğin, DiffMerge'i Git birleştirme aracı olarak ayarladım, bu birleştirme aracının belirli dosya türleri için eol'u yok saymasına izin veren bir kural kümesi ayarladım .
Windows veya MSysGit1.6.3 ile DOS veya Git bash oturumu için DiffMerge veya KDiff3 ile kurulum:
- PATH'nize bir dizin ayarlayın (burada:)
c:\HOMEWARE\cmd
.
- bu dizine merge.sh betiğini ekleyin (en sevdiğiniz birleştirme aracınızın sarıcısı)
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 için birleştirme paketinizi bildirin
Git config komutları:
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 öğesinin yanlış olup olmadığını kontrol edin
sistem düzeyinde git config:
git config ---system core.autoCRLF=false
- İki satır aynı olduğunda (ancak eol karakterleri), DiffMerge veya KDiff3'ün birleştirme sırasında bu satırı yok sayacağını test edin.
DOS komut dosyası (not: dos2unix komutu buradan gelir ve bir Unix eol stilini simüle etmek için kullanılır. Bu komut, bu yanıtın başında belirtilen dizine kopyalanmıştır.):
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):
Bu noktada ("return" tuşuna basmak), DiffMerge veya KDiff3 açılacak ve hangi satırların gerçekten birleştirildiğini ve hangi satırların yok sayıldığını kendiniz göreceksiniz.
Uyarı : sonuç dosyası her zaman DiffMerge ile Windows eol modunda (CRLF) olacaktır ...
KDiff3 bir şekilde kaydetmeyi önerir.