2013-11-21 29 views
6

Tôi đã sử dụng git trong một vài năm, và mỗi lần trong một thời gian khi thực hiện hợp nhất, git báo cáo một số mâu thuẫn kỳ lạ. Dưới đây là ví dụ về tệp .htaccess, từ khi tôi hợp nhất trong bản phát hành 7.24 mới của lõi Drupal:Git: các xung đột hợp nhất sai?

# Protect files and directories from prying eyes. 
<FilesMatch "\.(engine|inc|info|install|make|module|profile|test|po|sh|.*sql|theme|tpl(\.php)?|xtmpl)(~|\.sw[op]|\.bak|\.orig|\.save)?$|^(\..*|Entries.*|Repository|Root|Tag|Template)$|^#.*#$|\.php(~|\.sw[op]|\.bak|\.orig\.save)$"> 
<<<<<<< HEAD 
    Order allow,deny 
</FilesMatch> 

# Hide important scripts from malicious users. 
<FilesMatch "^(autoinstall\.php|install\.php|update\.php)$"> 
======= 
>>>>>>> 7.24 
    Order allow,deny 
</FilesMatch> 

Có xung đột ở đây như thế nào? Nó thậm chí không phải là một trường hợp tiềm năng của khoảng trắng/sự khác biệt cuối cùng: chỉ đơn giản là không có gì trong phần 7.24 của xung đột.

Tại sao git phàn nàn về điều này? Tôi có thể hiểu lầm gì đó cơ bản ...

Trả lời

1

Bạn không thể xác định được xung đột chỉ nhìn ở hai bên. Xung đột xảy ra khi cả hai bên thực hiện các thay đổi khác nhau từ tổ tiên chung.

Thực tế là có "không có gì" ở một bên không quan trọng - có thứ gì đó trong tổ tiên và cả hai bên đã thay đổi nó.

Bạn có thể nhận thêm dữ liệu về xung đột bằng cách hiển thị tổ tiên trong tệp xung đột; bạn có thể đặt:

git config merge.conflictstyle diff3 

Điều này sẽ cho bạn thấy cả ba mặt của xung đột.

0

Git chọn một tổ tiên chung cho hòa trộn của nó:

0 
|_________ 
    |  | 
    a  b 
    |_____|_ 
      | 
      M 

Nếu git phát hiện rằng cả hai ab những thay đổi từ 0, điều này gây ra một vấn đề hợp nhất ngăn chặn nó từ việc tự động tạo ra tệp đã hợp nhất M.

Bạn đã xem nó trong một công cụ hợp nhất 3 chiều thích hợp như p4merge? Nó có thể giúp cho bạn thấy những gì git nghĩ là tổ tiên chung và những gì nó nhận thức là sự thay đổi xung đột.

+1

Bạn cũng có thể bật "git config --grebal merge.conflictstyle diff3" để xem tổ tiên chung trong xung đột hợp nhất của bạn. –

0

Có một lời giải thích đàng hoàng của những gì có thể xảy ra với các cuộc xung đột không có thật của bạn ở đây: The criss-cross merge case (2005-04-28)

A 
|\ 
| \ 
| \ 
| \ 
| \ 
|  \ 
|  \ 
B8  C3 
|\  /| 
| \ /| 
| \/| 
| X | 
|/\ | 
|/ \ | 
|/  \| 
D8  E3 
\  | 
    \  | 
    \ | 
    \ | 
    \ | 
     \ | 
     \| 
     ? 

[...]

Vấn đề là không có tổ tiên duy nhất cho ba chiều merge làm điều đúng.

Ngẫu nhiên, bài đăng đó được viết bởi Bram Cohen - một trong những tác giả của BitTorrent. Sau đó ông đã cố gắng để phát triển his own alternative to Git mà ông hy vọng sẽ nhận được xung quanh các loại vấn đề. Phân tích của ông về vấn đề này đã được phát hiện, nhưng tôi không nghĩ ông ta có thể thực sự giải quyết nó. Có những lý do thú vị đằng sau lý do tại sao điều này có thể không giải quyết được, nhưng một bài đăng StackOverflow không phải là nơi thích hợp cho lỗ thỏ đó.

Các vấn đề liên quan