2013-11-21 24 views
6

Utilizzo git da alcuni anni, e ogni tanto durante l'unione, Git riporta alcuni bizzarri conflitti. Ecco un esempio di un file .htaccess, da quando ho fuso nel nuovo 7.24 rilascio di Drupal core:Git: falsi conflitti di unione?

# 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> 

Come c'è un conflitto qui? Non è nemmeno un potenziale caso di differenze tra spazio bianco e fine: c'è semplicemente nella sezione 7.24 del conflitto,.

Perché git si lamenta di questo? Probabilmente sto fraintendendo una cosa fondamentale ...

risposta

1

Non è possibile deteminare il conflitto guardando solo su due lati. Un conflitto si verifica quando entrambe le parti fanno diversi cambiamenti rispetto al comune antenato.

Il fatto che non ci sia "niente" su un lato non ha importanza: lo era qualcosa nell'antenato, ed entrambi i lati lo hanno cambiato.

È possibile ottenere più dati sul conflitto mostrando l'antenato nei file di conflitto; puoi impostare:

git config merge.conflictstyle diff3 

Quale ti mostrerà tutti e tre i lati del conflitto.

0

Git seleziona un antenato comune per le sue unioni:

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

Se git rileva che sia a e b sono le modifiche da 0, questo causa un problema di fusione impedendole dalla produzione automatica del file unito M.

Hai guardato in un corretto strumento di unione a 3 vie come p4merge? Può aiutare a mostrare ciò che pensa git è l'antenato condiviso e ciò che percepisce come il cambiamento in conflitto.

+1

È anche possibile abilitare "git config --global merge.conflictstyle diff3" per vedere l'antenato comune nei conflitti di unione. –

0

C'è una spiegazione decente di quello che probabilmente sta succedendo con i tuoi conflitti fasulli qui: The criss-cross merge case (2005-04-28)

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

[...]

Il problema è che non c'è nessun singolo antenato per il tre vie merge che fa la cosa giusta.

Per inciso, quel post è stato scritto da Bram Cohen - uno degli autori di BitTorrent. In seguito ha cercato di sviluppare his own alternative to Git che sperava di aggirare questo tipo di problemi. La sua analisi del problema è azzeccata, ma non penso che sia mai stato in grado di risolverlo veramente. Ci sono ragioni interessanti per cui questo è probabilmente irrisolvibile, ma un post StackOverflow non è il posto giusto per quella tana del coniglio.

Problemi correlati