diff --git a/hgext/fetch.py b/hgext/fetch.py
index b193a6e591319726e8ccd0b4322f9b4785f59390_aGdleHQvZmV0Y2gucHk=..0b6f12495276ea2551bb2cf191da7d4b9313e5be_aGdleHQvZmV0Y2gucHk= 100644
--- a/hgext/fetch.py
+++ b/hgext/fetch.py
@@ -17,7 +17,12 @@
 
     If the pulled changes add a new head, the head is automatically
     merged, and the result of the merge is committed.  Otherwise, the
-    working directory is updated.
+    working directory is updated to include the new changes.
+
+    When a merge occurs, the newly pulled changes are assumed to be
+    "authoritative".  The head of the new changes is used as the first
+    parent, with local changes as the second.  To switch the merge
+    order, use --switch-parent.
 
     See 'hg help dates' for a list of formats valid for -d/--date.
     '''
@@ -34,12 +39,7 @@
             newparent = newchildren[0]
             hg.clean(repo, newparent)
         newheads = [n for n in repo.heads() if n != newparent]
-        err = False
-        if newheads:
-            ui.status(_('merging with new head %d:%s\n') %
-                      (repo.changelog.rev(newheads[0]), short(newheads[0])))
-            err = hg.merge(repo, newheads[0], remind=False)
-        if not err and len(newheads) > 1:
+        if len(newheads) > 1:
             ui.status(_('not merging with %d other new heads '
                         '(use "hg heads" and "hg merge" to merge them)') %
                       (len(newheads) - 1))
@@ -43,6 +43,23 @@
             ui.status(_('not merging with %d other new heads '
                         '(use "hg heads" and "hg merge" to merge them)') %
                       (len(newheads) - 1))
+            return
+        err = False
+        if newheads:
+            # By default, we consider the repository we're pulling
+            # *from* as authoritative, so we merge our changes into
+            # theirs.
+            if opts['switch_parent']:
+                firstparent, secondparent = newparent, newheads[0]
+            else:
+                firstparent, secondparent = newheads[0], newparent
+                ui.status(_('updating to %d:%s\n') %
+                          (repo.changelog.rev(firstparent),
+                           short(firstparent)))
+            hg.clean(repo, firstparent)
+            ui.status(_('merging with %d:%s\n') %
+                      (repo.changelog.rev(secondparent), short(secondparent)))
+            err = hg.merge(repo, secondparent, remind=False)
         if not err:
             mod, add, rem = repo.status()[:3]
             message = (cmdutil.logmessage(opts) or
@@ -54,6 +71,7 @@
             ui.status(_('new changeset %d:%s merges remote changes '
                         'with local\n') % (repo.changelog.rev(n),
                                            short(n)))
+
     def pull():
         cmdutil.setremoteconfig(ui, opts)
 
@@ -97,6 +115,7 @@
         (fetch,
         [('r', 'rev', [], _('a specific revision you would like to pull')),
          ('f', 'force-editor', None, _('edit commit message')),
+         ('', 'switch-parent', None, _('switch parents when merging')),
         ] + commands.commitopts + commands.commitopts2 + commands.remoteopts,
         _('hg fetch [SOURCE]')),
 }
diff --git a/tests/test-fetch b/tests/test-fetch
index b193a6e591319726e8ccd0b4322f9b4785f59390_dGVzdHMvdGVzdC1mZXRjaA==..0b6f12495276ea2551bb2cf191da7d4b9313e5be_dGVzdHMvdGVzdC1mZXRjaA== 100755
--- a/tests/test-fetch
+++ b/tests/test-fetch
@@ -24,6 +24,7 @@
 hg clone c d
 hg clone c e
 
+echo % should merge c into a
 hg --cwd c fetch -d '4 0' -m 'automated merge' ../a
 ls c
 
@@ -37,3 +38,15 @@
 echo '% fetch over http with auth (should be hidden in desc)'
 hg --cwd e fetch -d '5 0' http://user:password@localhost:$HGPORT/
 hg --cwd e tip --template '{desc}\n'
+
+hg clone a f
+hg clone a g
+
+echo f > f/f
+hg --cwd f ci -d '6 0' -Amf
+
+echo g > g/g
+hg --cwd g ci -d '6 0' -Amg
+
+echo % should merge f into g
+hg --cwd g fetch --switch ../f
diff --git a/tests/test-fetch.out b/tests/test-fetch.out
index b193a6e591319726e8ccd0b4322f9b4785f59390_dGVzdHMvdGVzdC1mZXRjaC5vdXQ=..0b6f12495276ea2551bb2cf191da7d4b9313e5be_dGVzdHMvdGVzdC1mZXRjaC5vdXQ= 100644
--- a/tests/test-fetch.out
+++ b/tests/test-fetch.out
@@ -15,9 +15,10 @@
 adding c
 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+% should merge c into a
 pulling from ../a
 searching for changes
 adding changesets
 adding manifests
 adding file changes
 added 1 changesets with 1 changes to 1 files (+1 heads)
@@ -18,10 +19,12 @@
 pulling from ../a
 searching for changes
 adding changesets
 adding manifests
 adding file changes
 added 1 changesets with 1 changes to 1 files (+1 heads)
-merging with new head 2:97d72e5f12c7
+updating to 2:97d72e5f12c7
+1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+merging with 1:5e056962225c
 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
 new changeset 3:cd3a41621cf0 merges remote changes with local
 a
@@ -34,7 +37,9 @@
 adding manifests
 adding file changes
 added 1 changesets with 1 changes to 1 files (+1 heads)
-merging with new head 2:97d72e5f12c7
+updating to 2:97d72e5f12c7
+1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+merging with 1:5e056962225c
 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
 new changeset 3:0b6439e938f9 merges remote changes with local
 Automated merge with http://localhost:20059/
@@ -45,7 +50,9 @@
 adding manifests
 adding file changes
 added 1 changesets with 1 changes to 1 files (+1 heads)
-merging with new head 2:97d72e5f12c7
+updating to 2:97d72e5f12c7
+1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+merging with 1:5e056962225c
 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
 new changeset 3:0b6439e938f9 merges remote changes with local
 Automated merge with http://localhost:20059/
@@ -49,3 +56,18 @@
 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
 new changeset 3:0b6439e938f9 merges remote changes with local
 Automated merge with http://localhost:20059/
+2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+adding f
+adding g
+% should merge f into g
+pulling from ../f
+searching for changes
+adding changesets
+adding manifests
+adding file changes
+added 1 changesets with 1 changes to 1 files (+1 heads)
+0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+merging with 3:cc6a3744834d
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+new changeset 4:96d2275e70b4 merges remote changes with local