diff --git a/builtin-diff.c b/builtin-diff.c
index 7d5ad6271e8..dca223235de 100644
--- a/builtin-diff.c
+++ b/builtin-diff.c
@@ -347,7 +347,15 @@ int cmd_diff(int argc, const char **argv, char **envp)
 		return builtin_diff_index(&rev, argc, argv);
 	else if (ents == 2)
 		return builtin_diff_tree(&rev, argc, argv, ent);
+	else if ((ents == 3) && (ent[0].item->flags & UNINTERESTING)) {
+		/* diff A...B where there is one sane merge base between
+		 * A and B.  We have ent[0] == merge-base, ent[1] == A,
+		 * and ent[2] == B.  Show diff between the base and B.
+		 */
+		return builtin_diff_tree(&rev, argc, argv, ent);
+	}
 	else
-		return builtin_diff_combined(&rev, argc, argv, ent, ents);
+		return builtin_diff_combined(&rev, argc, argv,
+					     ent, ents);
 	usage(builtin_diff_usage);
 }