- if (!ref_newer(new_sha1, ref->old_sha1)) {
- error("remote '%s' isn't a strict parent of local", name);
- continue;
- }
-
- /* Ok, mark it for update */
- memcpy(ref->new_sha1, new_sha1, 20);
- }
-
- /*
- * See if we have any refs that the other end didn't have
- */
- if (nr_match) {
- local_ref_nr_match = nr_match;
- local_ref_match = match;
- local_ref_list = ref_list;
- local_last_ref = last_ref;
- for_each_ref(try_to_match);
- }
+ /* This part determines what can overwrite what.
+ * The rules are:
+ *
+ * (0) you can always use --force or +A:B notation to
+ * selectively force individual ref pairs.
+ *
+ * (1) if the old thing does not exist, it is OK.
+ *
+ * (2) if you do not have the old thing, you are not allowed
+ * to overwrite it; you would not know what you are losing
+ * otherwise.
+ *
+ * (3) if both new and old are commit-ish, and new is a
+ * descendant of old, it is OK.
+ */
+
+ if (!force_update &&
+ !is_zero_sha1(ref->old_sha1) &&
+ !ref->force) {
+ if (!has_sha1_file(ref->old_sha1)) {
+ error("remote '%s' object %s does not "
+ "exist on local",
+ ref->name, sha1_to_hex(ref->old_sha1));
+ continue;
+ }