diff -r 54e5c239c2d9 -r a8e6897dffbe mercurial/merge.py --- a/mercurial/merge.py Mon Apr 06 16:07:18 2015 -0700 +++ b/mercurial/merge.py Sun Apr 05 11:55:38 2015 -0700 @@ -1184,9 +1184,17 @@ labels - merge labels eg ['local', 'graft'] """ + # If we're grafting a descendant onto an ancestor, be sure to pass + # mergeancestor=True to update. This does two things: 1) allows the merge if + # the destination is the same as the parent of the ctx (so we can use graft + # to copy commits), and 2) informs update that the incoming changes are + # newer than the destination so it doesn't prompt about "remote changed foo + # which local deleted". + mergeancestor = repo.changelog.isancestor(repo['.'].node(), ctx.node()) stats = update(repo, ctx.node(), True, True, False, pctx.node(), - labels=labels) + mergeancestor=mergeancestor, labels=labels) + # drop the second merge parent repo.dirstate.beginparentchange() repo.setparents(repo['.'].node(), nullid)