"man gitglossary" contains this definition of an evil merge:
An evil merge is a merge that introduces changes that do not appear in any parent.
I am not sure I understand the point the authors are trying to get at. Why is it evil ?
"man gitglossary" contains this definition of an evil merge:
An evil merge is a merge that introduces changes that do not appear in any parent.
I am not sure I understand the point the authors are trying to get at. Why is it evil ?
Might be because it appears to be merge but is in fact not.
Because it's putting things in the code that no one ever asked to be there. As if you had this code:
$foo = bar;
$baz = qxx;
and this change:
$foo = bar;
$foo++;
$baz = qxx;
got merged with this change:
$foo = bar;
$foo--;
$baz = qxx;
in a fashion that somehow produced:
$foo = bar;
$foo++;
$foo--;
--$baz;
$baz = qxx;
Clearly, this is evil.
I would guess that it's of enough concern to be in man gitglossary
because the more involved your merging algorithms are, the more likely it is that they will produce such a thing.
I think it might be named 'evil merge' because it is difficult corner case for "git blame" to solve when annotating file (generating line-wise history annotations).
Evil merge migh be needed when you developed feature 'A' on main branch, and feature 'B' on side branch, and those features conflict in semantic (non-textual) way. An example would be using the same name for global variable, with different meanings -- this requires renaming the variable for one of features.
For evil merge "git show --cc
" has non-empty compact combined diff (but I am not sure if it is equivalence relation; the implication might be in one direction only, i.e. "evil merge" then non-empty "git diff-tree -p --cc
").