diff -r f546d2170b0f -r c791ed6a2154 mercurial/merge.py --- a/mercurial/merge.py Wed Jan 15 15:30:25 2020 -0800 +++ b/mercurial/merge.py Wed Jan 15 14:47:38 2020 -0800 @@ -2225,6 +2225,7 @@ labels=None, matcher=None, mergeforce=False, + updatedirstate=True, updatecheck=None, wc=None, ): @@ -2523,7 +2524,7 @@ # If we're doing a partial update, we need to skip updating # the dirstate. always = matcher is None or matcher.always() - updatedirstate = always and not wc.isinmemory() + updatedirstate = updatedirstate and always and not wc.isinmemory() if updatedirstate: repo.hook(b'preupdate', throw=True, parent1=xp1, parent2=xp2) # note that we're in the middle of an update @@ -2606,6 +2607,24 @@ return update(ctx.repo(), ctx.rev(), branchmerge=False, force=True, wc=wc) +def revert_to(ctx, matcher=None, wc=None): + """Revert the working copy to the given commit. + + The working copy will keep its current parent(s) but its content will + be the same as in the given commit. + """ + + return update( + ctx.repo(), + ctx.rev(), + branchmerge=False, + force=True, + updatedirstate=False, + matcher=matcher, + wc=wc, + ) + + def graft( repo, ctx,