Elijah Newren <newren@xxxxxxxxx> writes: > diff --git a/merge-recursive.c b/merge-recursive.c > index 2ecf495cc2..780f81a8bd 100644 > --- a/merge-recursive.c > +++ b/merge-recursive.c > @@ -1952,6 +1952,13 @@ int merge_trees(struct merge_options *o, > } > > if (oid_eq(&common->object.oid, &merge->object.oid)) { > + struct strbuf sb = STRBUF_INIT; > + > + if (index_has_changes(&sb)) { > + err(o, _("Dirty index: cannot merge (dirty: %s)"), > + sb.buf); > + return 0; > + } > output(o, 0, _("Already up to date!")); > *result = head; > return 1; I haven't come up with an addition to the test suite, but I suspect this change is conceptually wrong. What if a call to this function is made during a recursive, inner merge? Perhaps something like this is needed? merge-recursive.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/merge-recursive.c b/merge-recursive.c index 780f81a8bd..0fc580d8ca 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -1954,7 +1954,7 @@ int merge_trees(struct merge_options *o, if (oid_eq(&common->object.oid, &merge->object.oid)) { struct strbuf sb = STRBUF_INIT; - if (index_has_changes(&sb)) { + if (!o->call_depth && index_has_changes(&sb)) { err(o, _("Dirty index: cannot merge (dirty: %s)"), sb.buf); return 0;