for (i = 0; i < entries; i++) {
                struct cache_entry *ce = cache[i];
+               if (!ce->ce_mode)
+                       continue;
                if (ce_write(&c, newfd, ce, ce_size(ce)) < 0)
                        return -1;
        }
 
        return 1;
 }
 
+static int deleted_entry(struct cache_entry *ce, struct cache_entry *old, struct cache_entry **dst)
+{
+       if (old)
+               verify_uptodate(old);
+       ce->ce_mode = 0;
+       *dst++ = ce;
+       return 1;
+}
+
 static int threeway_merge(struct cache_entry *stages[4], struct cache_entry **dst)
 {
        struct cache_entry *old = stages[0];
                }
                else if (oldtree && !newtree && same(current, oldtree)) {
                        /* 10 or 11 */
-                       verify_uptodate(current);
-                       return 0;
+                       return deleted_entry(oldtree, current, dst);
                }
                else if (oldtree && newtree &&
                         same(current, oldtree) && !same(current, newtree)) {
                        /* 20 or 21 */
-                       verify_uptodate(current);
-                       return merged_entry(newtree, NULL, dst);
+                       return merged_entry(newtree, current, dst);
                }
                else
                        /* all other failures */
                        return -1;
        }
        else if (newtree)
-               return merged_entry(newtree, NULL, dst);
+               return merged_entry(newtree, current, dst);
        else
-               return 0;
+               return deleted_entry(oldtree, current, dst);
 }
 
 /*
        unsigned short mask = htons(CE_UPDATE);
        while (nr--) {
                struct cache_entry *ce = *src++;
+               if (!ce->ce_mode) {
+                       if (update)
+                               unlink(ce->name);
+                       continue;
+               }
                if (ce->ce_flags & mask) {
                        ce->ce_flags &= ~mask;
                        if (update)