merge_result_end = &entry->next;
 }
 
-static void merge_trees_recursive(struct tree_desc t[3], const char *base, int df_conflict);
+static void merge_trees(struct tree_desc t[3], const char *base);
 
 static const char *explanation(struct merge_list *entry)
 {
        add_merge_entry(final);
 }
 
-static void unresolved_directory(const struct traverse_info *info, struct name_entry n[3],
-                                int df_conflict)
+static void unresolved_directory(const struct traverse_info *info,
+                                struct name_entry n[3])
 {
        char *newbase;
        struct name_entry *p;
        buf2 = fill_tree_descriptor(t+2, ENTRY_SHA1(n + 2));
 #undef ENTRY_SHA1
 
-       merge_trees_recursive(t, newbase, df_conflict);
+       merge_trees(t, newbase);
 
        free(buf0);
        free(buf1);
 
        for (i = 0; i < 3; i++) {
                mask |= (1 << i);
-               if (n[i].mode && S_ISDIR(n[i].mode))
+               /*
+                * Treat missing entries as directories so that we return
+                * after unresolved_directory has handled this.
+                */
+               if (!n[i].mode || S_ISDIR(n[i].mode))
                        dirmask |= (1 << i);
        }
 
-       unresolved_directory(info, n, dirmask && (dirmask != mask));
+       unresolved_directory(info, n);
 
        if (dirmask == mask)
                return;
        return mask;
 }
 
-static void merge_trees_recursive(struct tree_desc t[3], const char *base, int df_conflict)
+static void merge_trees(struct tree_desc t[3], const char *base)
 {
        struct traverse_info info;
 
        setup_traverse_info(&info, base);
-       info.data = &df_conflict;
        info.fn = threeway_callback;
        traverse_trees(3, t, &info);
 }
 
-static void merge_trees(struct tree_desc t[3], const char *base)
-{
-       merge_trees_recursive(t, base, 0);
-}
-
 static void *get_tree_descriptor(struct tree_desc *desc, const char *rev)
 {
        unsigned char sha1[20];