Merge branch 'cc/replace-with-the-same-type'

* cc/replace-with-the-same-type:
  Doc: 'replace' merge and non-merge commits
  t6050-replace: use some long option names
  replace: allow long option names
  Documentation/replace: add Creating Replacement Objects section
  t6050-replace: add test to clean up all the replace refs
  t6050-replace: test that objects are of the same type
  Documentation/replace: state that objects must be of the same type
  replace: forbid replacing an object with one of a different type
diff --git a/builtin/replace.c b/builtin/replace.c
index 301b45c..b1bd3ef 100644
--- a/builtin/replace.c
+++ b/builtin/replace.c
@@ -85,6 +85,7 @@
 			  int force)
 {
 	unsigned char object[20], prev[20], repl[20];
+	enum object_type obj_type, repl_type;
 	char ref[PATH_MAX];
 	struct ref_lock *lock;
 
@@ -100,6 +101,15 @@
 	if (check_refname_format(ref, 0))
 		die("'%s' is not a valid ref name.", ref);
 
+	obj_type = sha1_object_info(object, NULL);
+	repl_type = sha1_object_info(repl, NULL);
+	if (!force && obj_type != repl_type)
+		die("Objects must be of the same type.\n"
+		    "'%s' points to a replaced object of type '%s'\n"
+		    "while '%s' points to a replacement object of type '%s'.",
+		    object_ref, typename(obj_type),
+		    replace_ref, typename(repl_type));
+
 	if (read_ref(ref, prev))
 		hashclr(prev);
 	else if (!force)
@@ -118,9 +128,9 @@
 {
 	int list = 0, delete = 0, force = 0;
 	struct option options[] = {
-		OPT_BOOL('l', NULL, &list, N_("list replace refs")),
-		OPT_BOOL('d', NULL, &delete, N_("delete replace refs")),
-		OPT_BOOL('f', NULL, &force, N_("replace the ref if it exists")),
+		OPT_BOOL('l', "list", &list, N_("list replace refs")),
+		OPT_BOOL('d', "delete", &delete, N_("delete replace refs")),
+		OPT_BOOL('f', "force", &force, N_("replace the ref if it exists")),
 		OPT_END()
 	};