diff --git a/mercurial/merge.py b/mercurial/merge.py --- a/mercurial/merge.py +++ b/mercurial/merge.py @@ -343,7 +343,12 @@ def manifestmerge(repo, wctx, p2, pa, br else: actions.append((f, "g", (fl2,), "remote created")) elif n2 and n2 != ma[f]: - prompts.append((f, "dc")) # prompt deleted/changed + different = _checkunknownfile(repo, wctx, p2, f) + if not force and different: + aborts.append((f, "ud")) + else: + # if different: old untracked f may be overwritten and lost + prompts.append((f, "dc")) # prompt deleted/changed for f, m in sorted(aborts): if m == "ud": diff --git a/tests/test-merge-remove.t b/tests/test-merge-remove.t --- a/tests/test-merge-remove.t +++ b/tests/test-merge-remove.t @@ -85,3 +85,30 @@ Reverting foo1 and bar: $ hg diff +Merge should not overwrite local file that is untracked after remove + + $ rm * + $ hg up -qC + $ hg rm bar + $ hg ci -m 'remove bar' + $ echo 'memories of buried pirate treasure' > bar + $ hg merge + bar: untracked file differs + abort: untracked files in working directory differ from files in requested revision + [255] + $ cat bar + memories of buried pirate treasure + +Those who use force will lose + + $ hg merge -f + remote changed bar which local deleted + use (c)hanged version or leave (d)eleted? c + merging foo1 and foo to foo1 + 1 files updated, 1 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + $ cat bar + bleh + $ hg st + M bar + M foo1