]> granicus.if.org Git - git/commitdiff
builtin rebase: fast-forward to onto if it is a proper descendant
authorPratik Karki <predatoramigo@gmail.com>
Wed, 8 Aug 2018 15:36:32 +0000 (21:21 +0545)
committerJunio C Hamano <gitster@pobox.com>
Thu, 11 Oct 2018 05:16:05 +0000 (14:16 +0900)
When trying to rebase onto a direct descendant of HEAD, we can
take a shortcut and fast-forward instead. This commit makes it so.

Signed-off-by: Pratik Karki <predatoramigo@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/rebase.c

index 49856d9bf76387a790c52c6a1f1432d817048b5c..7522be837c89517aa570d6553147618233fdeb25 100644 (file)
@@ -1368,6 +1368,24 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
                die(_("Could not detach HEAD"));
        strbuf_release(&msg);
 
+       /*
+        * If the onto is a proper descendant of the tip of the branch, then
+        * we just fast-forwarded.
+        */
+       strbuf_reset(&msg);
+       if (!oidcmp(&merge_base, &options.orig_head)) {
+               printf(_("Fast-forwarded %s to %s. \n"),
+                       branch_name, options.onto_name);
+               strbuf_addf(&msg, "rebase finished: %s onto %s",
+                       options.head_name ? options.head_name : "detached HEAD",
+                       oid_to_hex(&options.onto->object.oid));
+               reset_head(NULL, "Fast-forwarded", options.head_name, 0,
+                          "HEAD", msg.buf);
+               strbuf_release(&msg);
+               ret = !!finish_rebase(&options);
+               goto cleanup;
+       }
+
        strbuf_addf(&revisions, "%s..%s",
                    options.root ? oid_to_hex(&options.onto->object.oid) :
                    (options.restrict_revision ?