อัปเดต 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)
แพทช์สำหรับการละเว้นสไตล์ EOL ได้รับการเสนอในมิถุนายน 2007แต่เพียงความกังวลไม่ได้git diff --ignore-space-at-eol
git merge
ในเวลานั้นคำถามได้ถูกถามแล้ว:
ควร--ignore-space-at-eol
เป็นตัวเลือกในการgit-merge
?
การผสานเป็นหน้าที่การทำงานนี้มีความสำคัญ
ความหมายของการผสานการแก้ไขอัตโนมัติที่มีตัวเลือกเหล่านี้มีผลบังคับใช้ - พวกเขาใช้สำหรับการตรวจจับการเปลี่ยนชื่อเท่านั้นหรือเราเช่นไม่ตั้งค่าสถานะความขัดแย้งกับการเปลี่ยนแปลงช่องว่างเท่านั้น? และถ้าเราไม่ทำเราจะยอมรับเวอร์ชันใดโดยอัตโนมัติ
Julio C Hamano ไม่กระตือรือร้นอย่างแน่นอน:
นี่เป็นสิ่งล่อใจ แต่ฉันสงสัยว่าควรจะทิ้งไว้ในรอบต่อมา
ฉันสงสัยว่ามันจะแนะนำแนวคิดของ diffs สองแบบที่แตกต่างกันหนึ่งอันจะถูกประมวลผลทางกลไก (เช่นใช้ในการผสานกับ "git-merge-recursive" และใช้กับ "git-am") และอีกอันที่จะถูกตรวจสอบโดย มนุษย์เข้าใจ
บ่อยครั้งอาจเป็นประโยชน์ในการจัดการอินพุตสำหรับกรณีหลังแม้ว่าเอาต์พุตจากการเปรียบเทียบไฟล์อินพุต munged อาจไม่สามารถใช้งานได้อย่างง่ายดายสำหรับการใช้งานเชิงกล
แนวคิดทั่วไปเมื่อพูดถึงgit merge
คือการพึ่งพาเครื่องมือผสานของบุคคลที่สาม
ตัวอย่างเช่นฉันมีการติดตั้งDiffMergeเป็นเครื่องมือสำหรับการรวม Git การตั้งค่าrulesetซึ่งอนุญาตให้เครื่องมือผสานนั้นไม่สนใจ eol สำหรับไฟล์บางประเภท
ตั้งค่าบน Windows ด้วย MSysGit1.6.3 ไม่ว่าจะเป็นสำหรับเซสชัน DOS หรือ Git โดยใช้ DiffMerge หรือ KDiff3:
- ตั้งค่าไดเรกทอรีเข้ามาในเส้นทางของคุณ (ที่นี่:
c:\HOMEWARE\cmd
)
- เพิ่มในไดเรกทอรีนั้นสคริปต์ merge.sh (wrapper สำหรับเครื่องมือผสานที่คุณชื่นชอบ)
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
- ประกาศ wrapper ผสานของคุณสำหรับ 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 เป็นเท็จ
git config ที่ระดับระบบ:
git config ---system core.autoCRLF=false
- ทดสอบว่าเมื่อสองบรรทัดเหมือนกัน (แต่เป็น eol chars) ทั้ง DiffMerge หรือ KDiff3 จะละเว้นบรรทัดนั้นในระหว่างการผสาน
สคริปต์ DOS (หมายเหตุ: คำสั่ง dos2unix มาจากที่นี่และใช้เพื่อจำลอง Unix eol-style คำสั่งนั้นถูกคัดลอกในไดเรกทอรีที่กล่าวถึงในตอนต้นของคำตอบนี้):
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 จะเปิดขึ้นและคุณจะเห็นด้วยตัวคุณเองว่าบรรทัดใดที่ถูกรวมกันจริง ๆ และบรรทัดใดที่ถูกละเว้น
คำเตือน : ไฟล์ผลลัพธ์จะอยู่ในโหมด Windows eol (CRLF) เสมอโดยมี DiffMerge ...
KDiff3 เสนอให้บันทึกในวิธีใดวิธีหนึ่ง