Cập nhật 2013:
Các phiên bản git gần đây cho phép sử dụng hợp nhất với tùy chọnrecursive
chiến lược và chiến lược ( ):-X
git merge -s đệ quy -Xignore-space-at-eol
Nhưng sử dụng " -Xignore-space-change
" cũng là một khả năng
jakub.g cũng nhận xét rằng các chiến lược cũng hoạt động với việc hái anh đào :
git cherry-pick abcd123456 --strategy=recursive --strategy-option=renormalize
Điều này hoạt động tốt hơn nhiều ignore-all-space
.
Câu trả lời gốc (tháng 5 năm 2009)
Bản vá cho việc bỏ qua phong cách eol đã được đề xuất vào tháng 6 năm 2007 , nhưng nó chỉ quan tâm git diff --ignore-space-at-eol
chứ không phải git merge
.
Vào thời điểm đó, câu hỏi đã được đưa ra:
Nên --ignore-space-at-eol
là một lựa chọn để git-merge
?
Sáp nhập là nơi chức năng này quan trọng.
Các ngữ nghĩa của hợp nhất được giải quyết tự động với các tùy chọn đó có hiệu lực - chúng chỉ được sử dụng để đổi tên phát hiện, hoặc chúng ta, ví dụ, không gắn cờ xung đột với chỉ thay đổi khoảng trắng? Và nếu chúng ta không, chúng ta sẽ chấp nhận phiên bản nào?
Julio C Hamano không thực sự nhiệt tình:
Điều này chắc chắn là hấp dẫn, nhưng tôi nghi ngờ rằng nên để lại cho các vòng sau.
Tôi nghi ngờ rằng nó sẽ đưa ra một khái niệm về hai loại khác nhau, một loại được xử lý cơ học (nghĩa là sử dụng kết hợp với "git-merge-recursive" và áp dụng với "git-am") và một loại khác được kiểm tra bởi con người hiểu.
Nó thường có thể hữu ích để chuyển đổi đầu vào cho trường hợp sau, mặc dù đầu ra từ việc so sánh các tệp đầu vào bị trộn có thể không sử dụng được cho ứng dụng cơ học.
Ý tưởng chung, khi nói đến git merge
, là dựa vào công cụ hợp nhất của bên thứ ba.
Chẳng hạn, tôi đã thiết lập DiffMerge làm công cụ hợp nhất Git, thiết lập một quy tắc cho phép công cụ hợp nhất đó bỏ qua eol cho một số loại tệp nhất định.
Thiết lập trên Windows, với MSysGit1.6.3, cho phiên bash DOS hoặc Git, với DiffMerge hoặc KDiff3:
- thiết lập một thư mục vào PATH của bạn (ở đây
c:\HOMEWARE\cmd
:).
- thêm vào thư mục đó script merge.sh (trình bao bọc cho công cụ hợp nhất yêu thích của bạn)
hợp nhất.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
- Khai báo trình bao bọc hợp nhất của bạn cho Git
Các lệnh cấu hình 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
- Kiểm tra xem autoCRLF có sai không
cấu hình git ở cấp hệ thống:
git config ---system core.autoCRLF=false
- Kiểm tra xem, khi hai dòng giống hệt nhau (nhưng ký tự eol của chúng), cả DiffMerge hoặc KDiff3 sẽ bỏ qua các dòng đó trong quá trình hợp nhất.
Tập lệnh DOS (lưu ý: lệnh dos2unix xuất phát từ đây và được sử dụng để mô phỏng kiểu Unix eol. Lệnh đó đã được sao chép trong thư mục được đề cập ở đầu câu trả lời này.):
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):
Tại thời điểm này (Đánh dấu "trở lại"), DiffMerge hoặc KDiff3 sẽ mở ra và bạn sẽ tự mình nhìn thấy những dòng nào thực sự được hợp nhất và những dòng nào bị bỏ qua.
Cảnh báo : tệp kết quả sẽ luôn ở chế độ eol của Windows (CRLF) với DiffMerge ...
KDiff3 cung cấp để lưu theo cách này hay cách khác.