Index: trac/wiki/web_ui.py
===================================================================
--- trac/wiki/web_ui.py	(revision 5851)
+++ trac/wiki/web_ui.py	(working copy)
@@ -124,14 +124,16 @@
             if action == 'edit':
                 if 'cancel' in req.args:
                     req.redirect(req.href.wiki(page.name))
-                elif int(version) != latest_page.version:
-                    return self._render_editor(context, 'collision')
-                elif 'preview' in req.args:
-                    return self._render_editor(context, 'preview')
-                elif 'diff' in req.args:
-                    return self._render_editor(context, 'diff')
+                
+                has_collision = int(version) != latest_page.version
+                for a in ('preview', 'diff', 'merge'):
+                    if a in req.args:
+                        action = a
+                        break
+                if action == 'edit' and not has_collision:
+                    self._do_save(context)
                 else:
-                    self._do_save(context)
+                    return self._render_editor(context, action, has_collision)
             elif action == 'delete':
                 self._do_delete(context)
             elif action == 'diff':
@@ -380,9 +382,25 @@
         })
         return 'wiki_diff.html', data, None
 
-    def _render_editor(self, context, action='edit'):
+    def _render_editor(self, context, action='edit', has_collision=False):
+        if has_collision:
+            if action == 'merge':
+                context = context(realm=context.realm, id=context.id,
+                                  version=None)
+                context.req.warning(
+                    _("There have been changes made by others since you "
+                      "started your edits. If you save now, you risk to "
+                      "revert those changes (highlighted here as deletions). "
+                      "Please go through all the changes and manually merge "
+                      "the changes you want to keep. "
+                      "If you're unsure about what you're doing, "
+                      "please press Cancel (loosing your changes) "
+                      "and start editing again."))
+            else:
+                action = 'collision'
+
         page, req = context.resource, context.req
-        context.version = None # use implicit ''latest'' in links
+        context.version = None # always use implicit ''latest'' in links
 
         if page.readonly:
             req.perm.require('WIKI_ADMIN', context)
@@ -419,7 +437,7 @@
             'scroll_bar_pos': req.args.get('scroll_bar_pos', ''),
             'diff': None,
         })
-        if action == 'diff':
+        if action in ('diff', 'merge'):
             old_text = original_text and original_text.splitlines() or []
             new_text = page.text and page.text.splitlines() or []
             diff_data, changes = self._prepare_diff(
Index: trac/wiki/templates/wiki_edit.html
===================================================================
--- trac/wiki/templates/wiki_edit.html	(revision 5851)
+++ trac/wiki/templates/wiki_edit.html	(working copy)
@@ -113,6 +113,7 @@
         <div class="buttons" py:choose="action">
           <py:when test="'collision'">
             <input type="submit" name="preview" value="Preview" disabled="disabled" />&nbsp;
+            <input type="submit" name="merge" value="Merge changes" accesskey="r" />&nbsp;
             <input type="submit" name="save" value="Submit changes" disabled="disabled" />&nbsp;
           </py:when>
           <py:otherwise>

