krosenvold
krosenvold

Reputation: 77151

Evil merges in git?

"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 ?

Upvotes: 32

Views: 11084

Answers (4)

jbialobr
jbialobr

Reputation: 1520

It is worth to mention that an "evil change" from an "evil merge" can be lost silently while rebasing an "evil merge" containing an "evil change" which does not conflict with other commits. Using --preserve-merges does not help in such a case.

Upvotes: 7

Adam Kurkiewicz
Adam Kurkiewicz

Reputation: 1632

In the words of Linus Torvalds himself (taken from the git mailing list):

an "evil merge" is something that makes changes that came from neither side and aren't actually resolving a conflict

Upvotes: 28

Jakub Narębski
Jakub Narębski

Reputation: 323464

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").

Upvotes: 10

chaos
chaos

Reputation: 124297

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.

Upvotes: 27

Related Questions