diff --git a/rev-list.c b/rev-list.c
index fb75c22bc7c..abb611f8b50 100644
--- a/rev-list.c
+++ b/rev-list.c
@@ -377,7 +377,7 @@ static struct commit *get_commit_reference(const char *name, unsigned int flags)
 	if (object->type == tree_type) {
 		struct tree *tree = (struct tree *)object;
 		if (!tree_objects)
-			die("%s is a tree object, not a commit", name);
+			return NULL;
 		if (flags & UNINTERESTING) {
 			mark_tree_uninteresting(tree);
 			return NULL;
@@ -392,7 +392,7 @@ static struct commit *get_commit_reference(const char *name, unsigned int flags)
 	if (object->type == blob_type) {
 		struct blob *blob = (struct blob *)object;
 		if (!blob_objects)
-			die("%s is a blob object, not a commit", name);
+			return NULL;
 		if (flags & UNINTERESTING) {
 			mark_blob_uninteresting(blob);
 			return NULL;
diff --git a/rev-parse.c b/rev-parse.c
index c134ffda191..c096dc45ee7 100644
--- a/rev-parse.c
+++ b/rev-parse.c
@@ -5,6 +5,7 @@
  */
 #include "cache.h"
 #include "commit.h"
+#include "refs.h"
 
 static char *def = NULL;
 static int no_revs = 0;
@@ -46,7 +47,7 @@ static int is_rev_argument(const char *arg)
 	}
 }
 
-static void show_rev(int type, unsigned char *sha1)
+static void show_rev(int type, const unsigned char *sha1)
 {
 	if (no_revs)
 		return;
@@ -142,6 +143,12 @@ static void show_default(void)
 	}
 }
 
+static int show_reference(const char *refname, const unsigned char *sha1)
+{
+	show_rev(NORMAL, sha1);
+	return 0;
+}
+
 int main(int argc, char **argv)
 {
 	int i, as_is = 0;
@@ -185,6 +192,10 @@ int main(int argc, char **argv)
 				show_type ^= REVERSED;
 				continue;
 			}
+			if (!strcmp(arg, "--all")) {
+				for_each_ref(show_reference);
+				continue;
+			}
 			show_arg(arg);
 			continue;
 		}