2009-09-22 19 views
18

"uomo gitglossary" contiene questa definizione di un male merge:Il male si fonde in git?

Un merge male è un'unione che introduce modifiche che non appaiono in qualsiasi genitore.

Non sono sicuro di capire il punto che gli autori stanno cercando di ottenere. Perché è cattivo?

+2

Sono venuto qui da [questa pagina] (http: // StackOverflow.it/questions/2910044/does-git-have-evil-twin-issues/2910388 # 2910388) e ho trovato molto utile rendersi conto che non è "la fusione del male di Git": la fusione del male è ** non un po 'naturale fenomeno ** che a volte accade; Piuttosto, è qualcosa che le persone a volte fanno in git (proprio come le persone a volte causano altri incidenti come spingere le modifiche forzate a un repo pubblico). Il takeaway qui è: non farlo! (o almeno conservare la semantica di fusione_) – sehe

+0

sehe ha ragione, queste sono le parole di Linus Torvalds stesso: una "fusione del male" è qualcosa che apporta modifiche che non provengono né dal lato né stanno effettivamente risolvendo un conflitto –

risposta

16

Perché sta mettendo le cose nel codice che nessuno ha mai chiesto di essere lì. Come se tu avessi questo codice:

$foo = bar; 
$baz = qxx; 

e questo cambiamento:

$foo = bar; 
$foo++; 
$baz = qxx; 

preso fusa con questo cambiamento:

$foo = bar; 
$foo--; 
$baz = qxx; 

in un modo che in qualche modo ha prodotto:

$foo = bar; 
$foo++; 
$foo--; 
--$baz; 
$baz = qxx; 

Chiaramente, questo è il male.

Direi che è abbastanza preoccupante per essere in man gitglossary perché più sono coinvolti gli algoritmi di fusione, più è probabile che produrranno una cosa del genere.

+2

A produci questo, chiama semplicemente git-merge con l'opzione --no-commit, aggiungi altre modifiche, controllale e commit. Il messaggio di unione merge pregenerato verrà automaticamente utilizzato. – Cascabel

+1

@Jefromi Con questa definizione, qualsiasi unione con un conflitto che deve essere risolto manualmente è un'unione malefica? C'è una forte differenza semantica con ciò che dice @chaos; potresti potenzialmente ottenere i suoi risultati senza ottenere alcun tipo di conflitto nel processo di unione. Che è veramente malvagio. – krosenvold

+9

Dove è stato - $ baz; vieni da Non pensavo che GIT producesse codice a caso. Per me è abbastanza malvagio che l'incremento e il decremento si siano fusi senza che nessuno abbia chiarito qual è il codice corretto. Il risultato è che le due modifiche infrangono il codice. La linea che veniva dal nulla dovrebbe essere messa da qualcuno manualmente "correggendo" l'unione. A quel punto, non è colpa di GIT?!?!? –

8

Penso che potrebbe essere chiamato 'unione malefica' perché è difficile il caso angolo per "git blame" da risolvere quando si annota il file (generando annotazioni cronologiche linea-saggio).


merge male migh essere necessaria quando si sviluppato funzionalità di 'A' sul ramo principale, e dispongono di 'B' sul ramo lato, e quelli caratteristiche conflitto in modo semantica (non testuale). Un esempio potrebbe utilizzare lo stesso nome per la variabile globale, con significati diversi: è necessario rinominare la variabile per una delle funzionalità.

Per unione male "git show --cc" ha non vuoto compatta diff combinato (ma non sono sicuro se è relazione di equivalenza; l'implicazione potrebbe essere in una sola direzione, cioè "male merge" allora non vuoto "").

+1

Intuitivamente, la risposta di @chaos sembra più corretta, ma so che sei bravo con queste cose;) Sembra che tu stia descrivendo un buon vecchio conflitto di fusione, in cui 2 persone hanno risolto parti sovrapposte dello stesso problema - o forse anche lo stesso problema. Una volta terminata l'unione, perché vorresti ricrearla? Non è eccessivamente poetico chiamare questo "abbastanza regolare" incidente "malvagio"? – krosenvold

+2

Risolvere un conflitto * di solito * implica la scelta di una delle versioni rispetto all'altra, a volte scegliendo una versione di linee su linee da un'altra versione. La fusione del male ha linee che non sono in nessuno dei suoi genitori, quindi non può essere ricreata automaticamente nemmeno con una strategia di fusione più generica (generica). –

+0

* (Riga rimossa per l'unione "cattiva" e processo automatico) * –

9

Nelle parole di Linus Torvalds se stesso (tratto dal git mailing list):

un "merge male" è qualcosa che apporta modifiche che provenivano da nessuna lato e non sono in realtà risolvere un conflitto

0

Vale la pena menzionare che un "cambiamento malvagio" da una "fusione del male" può essere perso silenziosamente mentre si ridefinisce una "fusione del male" contenente un "cambiamento malvagio" che non è in conflitto con altri commit. L'utilizzo di --preserve-merges non è d'aiuto in such a case.

Problemi correlati