From: Phillip Wood <phillip.wood123@gmail.com>
To: Elijah Newren via GitGitGadget <gitgitgadget@gmail.com>,
git@vger.kernel.org
Cc: Johannes.Schindelin@gmx.de, phillip.wood@dunelm.org.uk,
liu.denton@gmail.com, gitster@pobox.com, plroskin@gmail.com,
alban.gruin@gmail.com, szeder.dev@gmail.com, jrnieder@gmail.com,
emilyshaffer@google.com, Elijah Newren <newren@gmail.com>
Subject: Re: [PATCH v4 00/19] rebase: make the default backend configurable
Date: Fri, 17 Jan 2020 16:58:31 +0000 [thread overview]
Message-ID: <47e7c9e6-7d83-185d-792d-f8e084c1a7a1@gmail.com> (raw)
In-Reply-To: <pull.679.v4.git.git.1579155273.gitgitgadget@gmail.com>
Hi Elijah
On 16/01/2020 06:14, Elijah Newren via GitGitGadget wrote:
> This is a re-roll of en/rebase-backend which has been rebased on v2.25.0 and
> updated to remove the dependence on ra/rebase-i-more-options, and also tries
> to address feedback from Phillip, Junio, and Jonathan. This series does a
> lot of work around making the default rebase backend configurable, and
> switches the default from the am backend to the merge/interactive one.
>
> Changes since v3:
>
> * Rebased on origin/master and updated to remove the dependence on
> ra/rebase-i-more-options.
> * Added two new patches at the start of the series.
> * Split the old first patch into two, while modifying them based on
> Phillip's feedback (though slightly differently than discussed on the
> list; instead of making --keep-empty a synonym for --empty=keep, I
> instead kept backward compatibility by making it a no-op).
> * I noted the post-commit hook in the differences between backends. Emily
> is investigating what changes need to happen there, so I merely
> documented the existing differences.
> * dropped '-i' from the reflog messages; now they just refer to 'rebase'
>
> Changes possibly missing from this version, for discussion:
>
> * I did not remove the --am option as suggested by Phillip, since Junio and
> Phillip were still discussing whether it is wanted/needed. > * I did not address the last two items Jonathan brought up as I
couldn't
> find enough information to reproduce or understand the problems.
I think I've got a fix for the failure with
--committer-date-is-author-date that Jonathan reported which I'll post
next week - the bug was not in this series, it was just exposed by it.
I'll try and read through this series next week as well.
Best Wishes
Phillip
>
> Elijah Newren (19):
> git-rebase.txt: update description of --allow-empty-message
> t3404: directly test the behavior of interest
> rebase (interactive-backend): make --keep-empty the default
> rebase (interactive-backend): fix handling of commits that become
> empty
> t3406: simplify an already simple test
> rebase, sequencer: remove the broken GIT_QUIET handling
> rebase: make sure to pass along the quiet flag to the sequencer
> rebase: fix handling of restrict_revision
> t3432: make these tests work with either am or merge backends
> rebase: allow more types of rebases to fast-forward
> git-rebase.txt: add more details about behavioral differences of
> backends
> rebase: move incompatibility checks between backend options a bit
> earlier
> rebase: add an --am option
> git-prompt: change the prompt for interactive-based rebases
> rebase: drop '-i' from the reflog for interactive-based rebases
> rebase tests: mark tests specific to the am-backend with --am
> rebase tests: repeat some tests using the merge backend instead of am
> rebase: make the backend configurable via config setting
> rebase: change the default backend from "am" to "merge"
>
> Documentation/config/rebase.txt | 8 ++
> Documentation/git-rebase.txt | 150 +++++++++++++++++---
> builtin/rebase.c | 186 +++++++++++++++++++------
> contrib/completion/git-prompt.sh | 6 +-
> rebase-interactive.c | 7 +-
> rebase-interactive.h | 2 +-
> sequencer.c | 84 ++++++-----
> sequencer.h | 3 +-
> t/t3400-rebase.sh | 36 ++++-
> t/t3401-rebase-and-am-rename.sh | 4 +-
> t/t3404-rebase-interactive.sh | 19 +--
> t/t3406-rebase-message.sh | 19 ++-
> t/t3407-rebase-abort.sh | 6 +-
> t/t3420-rebase-autostash.sh | 2 +-
> t/t3421-rebase-topology-linear.sh | 16 +--
> t/t3424-rebase-empty.sh | 108 ++++++++++++++
> t/t3425-rebase-topology-merges.sh | 8 +-
> t/t3427-rebase-subtree.sh | 12 +-
> t/t3432-rebase-fast-forward.sh | 54 ++++---
> t/t5407-post-rewrite-hook.sh | 12 +-
> t/t5520-pull.sh | 27 +++-
> t/t6047-diff3-conflict-markers.sh | 13 +-
> t/t7512-status-help.sh | 12 +-
> t/t9106-git-svn-commit-diff-clobber.sh | 3 +-
> t/t9903-bash-prompt.sh | 8 +-
> 25 files changed, 595 insertions(+), 210 deletions(-)
> create mode 100755 t/t3424-rebase-empty.sh
>
>
> base-commit: d0654dc308b0ba76dd8ed7bbb33c8d8f7aacd783
> Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-679%2Fnewren%2Frebase-fixes-v4
> Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-679/newren/rebase-fixes-v4
> Pull-Request: https://github.com/git/git/pull/679
>
> Range-diff vs v3:
>
> -: ---------- > 1: 3ea48d5394 git-rebase.txt: update description of --allow-empty-message
> -: ---------- > 2: 10fdd162a0 t3404: directly test the behavior of interest
> 1: 1c2b77e94d ! 3: 179f82ab83 rebase: extend the options for handling of empty commits
> @@ -1,49 +1,46 @@
> Author: Elijah Newren <newren@gmail.com>
>
> - rebase: extend the options for handling of empty commits
> + rebase (interactive-backend): make --keep-empty the default
>
> - Extend the interactive machinery with the ability to handle the full
> - spread of options for how to handle commits that either start or become
> - empty (by "become empty" I mean the changes in a commit are a subset of
> - changes that exist upstream, so the net effect of applying the commit is
> - no changes). Introduce a new command line flag for selecting the
> - desired behavior:
> - --empty={drop,keep,ask}
> - with the definitions:
> - drop: drop empty commits
> - keep: keep empty commits
> - ask: provide the user a chance to interact and pick what to do with
> - empty commits on a case-by-case basis
> + Different rebase backends have different treatment for commits which
> + start empty (i.e. have no changes relative to their parent), and the
> + --keep-empty option was added at some point to allow adjusting behavior
> + for the interactive backend. The handling of commits which start empty
> + is actually quite similar to commit b00bf1c9a8dd (git-rebase: make
> + --allow-empty-message the default, 2018-06-27), which pointed out that
> + the behavior for various backends is often more happenstance than
> + design. The specific change made in that commit is actually quite
> + relevant as well and much of the logic there directly applies here.
>
> - Note that traditionally, am-based rebases have always dropped commits
> - that either started or became empty, while interactive-based rebases
> - have defaulted to ask (and provided an option to keep commits that
> - started empty). This difference made sense since users of an am-based
> - rebase just wanted to quickly batch apply a sequence of commits, while
> - users editing a todo list will likely want the chance to interact and
> - handle unusual cases on a case-by-case basis. However, not all rebases
> - using the interactive machinery are explicitly interactive anymore. In
> - particular --merge was always meant to behave more like --am: just
> - rebase a batch of commits without popping up a todo list.
> + It makes a lot of sense in 'git commit' to error out on the creation of
> + empty commits, unless an override flag is provided. However, once
> + someone determines that there is a rare case that merits using the
> + manual override to create such a commit, it is somewhere between
> + annoying and harmful to have to take extra steps to keep such
> + intentional commits around. Granted, empty commits are quite rare,
> + which is why handling of them doesn't get considered much and folks tend
> + to defer to existing (accidental) behavior and assume there was a reason
> + for it, leading them to just add flags (--keep-empty in this case) that
> + allow them to override the bad defaults. Fix the interactive backend so
> + that --keep-empty is the default, much like we did with
> + --allow-empty-message. The am backend should also be fixed to have
> + --keep-empty semantics for commits that start empty, but that is not
> + included in this patch other than a testcase documenting the failure.
>
> - If the --empty flag is not specified, pick defaults as follows:
> - explicitly interactive: ask
> - --exec: keep (exec is about checking existing commits, and often
> - used without actually changing the base. Thus the
> - expectation is that the user doesn't necessarily want
> - anything to change; they just want to test).
> - otherwise: drop
> -
> - Also, this commit makes --keep-empty just imply --empty=keep, and hides
> - it from help so that we aren't confusing users with different ways to do
> - the same thing. (I could have added a --drop-empty flag, but then that
> - invites users to specify both --keep-empty and --drop-empty and we have
> - to add sanity checking around that; it seems cleaner to have a single
> - multi-valued option.) This actually fixes --keep-empty too; previously,
> - it only meant to sometimes keep empty commits, in particular commits
> - which started empty would be kept. But it would still error out and ask
> - the user what to do with commits that became empty. Now it keeps empty
> - commits, as instructed.
> + Note that there was one test in t3421 which appears to have been written
> + expecting --keep-empty to not be the default as correct behavior. This
> + test was introduced in commit 00b8be5a4d38 ("add tests for rebasing of
> + empty commits", 2013-06-06), which was part of a series focusing on
> + rebase topology and which had an interesting original cover letter at
> + https://lore.kernel.org/git/1347949878-12578-1-git-send-email-martinvonz@gmail.com/
> + which noted
> + Your input especially appreciated on whether you agree with the
> + intent of the test cases.
> + and then went into a long example about how one of the many tests added
> + had several questions about whether it was correct. As such, I believe
> + most the tests in that series were about testing rebase topology with as
> + many different flags as possible and were not trying to state in general
> + how those flags should behave otherwise.
>
> Signed-off-by: Elijah Newren <newren@gmail.com>
>
> @@ -51,126 +48,62 @@
> --- a/Documentation/git-rebase.txt
> +++ b/Documentation/git-rebase.txt
> @@
> - original branch. The index and working tree are also left
> unchanged as a result.
>
> -+--empty={drop,keep,ask}::
> -+ How to handle commits that become empty (because they contain a
> -+ subset of already upstream changes) or start empty. With drop
> -+ (the default), commits that start or become empty are dropped.
> -+ With keep (implied by --exec), such commits are kept. With ask
> -+ (implied by --interactive), the rebase will halt when an empty
> -+ commit is applied allowing you to choose whether to drop it or
> -+ commit it. Also with ask, if the rebase is interactive then
> -+ commits which start empty will be commented out in the todo
> -+ action list (giving you a chance to uncomment).
> -++
> -+Note that this has no effect on commits which are already upstream (as
> -+can be checked via `git log --cherry-mark ...`), which are always
> -+dropped by rebase.
> -++
> -+See also INCOMPATIBLE OPTIONS below.
> -+
> --keep-empty::
> - Keep the commits that do not change anything from its
> - parents in the result.
> -+ Deprecated alias for what is now known as --empty=keep.
> ++ No-op. Rebasing commits that started empty (had no change
> ++ relative to their parent) used to fail and this option would
> ++ override that behavior, allowing commits with empty changes to
> ++ be rebased. Now commits with no changes do not cause rebasing
> ++ to halt.
> +
> - See also INCOMPATIBLE OPTIONS below.
> -
> -@@
> - * --interactive
> - * --exec
> - * --keep-empty
> -+ * --empty=
> - * --edit-todo
> - * --root when used in combination with --onto
> -
> -@@
> - * --preserve-merges and --ignore-whitespace
> - * --preserve-merges and --committer-date-is-author-date
> - * --preserve-merges and --ignore-date
> -+ * --preserve-merges and --empty=
> - * --keep-base and --onto
> - * --keep-base and --root
> +-See also INCOMPATIBLE OPTIONS below.
> ++See also BEHAVIORAL DIFFERENCES and INCOMPATIBLE OPTIONS below.
>
> + --allow-empty-message::
> + No-op. Rebasing commits with an empty message used to fail
> @@
> + Empty commits
> + ~~~~~~~~~~~~~
>
> - There are some subtle differences how the backends behave.
> -
> --Empty commits
> --~~~~~~~~~~~~~
> --
> -The am backend drops any "empty" commits, regardless of whether the
> -commit started empty (had no changes relative to its parent to
> -start with) or ended empty (all changes were already applied
> -upstream in other commits).
> --
> ++The am backend unfortunately drops intentionally empty commits, i.e.
> ++commits that started empty, though these are rare in practice. It
> ++also drops commits that become empty and has no option for controlling
> ++this behavior.
> +
> -The interactive backend drops commits by default that
> -started empty and halts if it hits a commit that ended up empty.
> -The `--keep-empty` option exists for the interactive backend to allow
> -it to keep commits that started empty.
> --
> ++The interactive backend keeps intentionally empty commits.
> ++Unfortunately, it always halts whenever it runs across a commit that
> ++becomes empty, even when the rebase is not explicitly interactive.
> +
> Directory rename detection
> ~~~~~~~~~~~~~~~~~~~~~~~~~~
> -
>
> diff --git a/builtin/rebase.c b/builtin/rebase.c
> --- a/builtin/rebase.c
> +++ b/builtin/rebase.c
> -@@
> - REBASE_PRESERVE_MERGES
> - };
> -
> -+enum empty_type {
> -+ EMPTY_UNSPECIFIED = -1,
> -+ EMPTY_DROP,
> -+ EMPTY_KEEP,
> -+ EMPTY_ASK
> -+};
> -+
> - struct rebase_options {
> - enum rebase_type type;
> -+ enum empty_type empty;
> - const char *state_dir;
> - struct commit *upstream;
> - const char *upstream_name;
> @@
> const char *action;
> int signoff;
> int allow_rerere_autoupdate;
> - int keep_empty;
> int autosquash;
> - int ignore_whitespace;
> char *gpg_sign_opt;
> -@@
> -
> - #define REBASE_OPTIONS_INIT { \
> - .type = REBASE_UNSPECIFIED, \
> -+ .empty = EMPTY_UNSPECIFIED, \
> - .flags = REBASE_NO_QUIET, \
> - .git_am_opts = ARGV_ARRAY_INIT, \
> - .git_format_patch_opt = STRBUF_INIT \
> -@@
> - replay.allow_rerere_auto = opts->allow_rerere_autoupdate;
> - replay.allow_empty = 1;
> - replay.allow_empty_message = opts->allow_empty_message;
> -+ replay.drop_redundant_commits = (opts->empty == EMPTY_DROP);
> -+ replay.keep_redundant_commits = (opts->empty == EMPTY_KEEP);
> -+ replay.ask_on_initially_empty = (opts->empty == EMPTY_ASK &&
> -+ !(opts->flags & REBASE_INTERACTIVE_EXPLICIT));
> - replay.verbose = opts->flags & REBASE_VERBOSE;
> - replay.reschedule_failed_exec = opts->reschedule_failed_exec;
> - replay.committer_date_is_author_date =
> + int autostash;
> @@
>
> git_config_get_bool("rebase.abbreviatecommands", &abbreviate_commands);
>
> - flags |= opts->keep_empty ? TODO_LIST_KEEP_EMPTY : 0;
> -+ flags |= (opts->empty == EMPTY_DROP) ? TODO_LIST_DROP_EMPTY : 0;
> -+ flags |= (opts->empty == EMPTY_ASK &&
> -+ opts->flags & REBASE_INTERACTIVE_EXPLICIT) ?
> -+ TODO_LIST_ASK_EMPTY : 0;
> flags |= abbreviate_commands ? TODO_LIST_ABBREVIATE_CMDS : 0;
> flags |= opts->rebase_merges ? TODO_LIST_REBASE_MERGES : 0;
> flags |= opts->rebase_cousins > 0 ? TODO_LIST_REBASE_COUSINS : 0;
> @@ -183,10 +116,8 @@
> +{
> + struct rebase_options *opts = opt->value;
> +
> -+ BUG_ON_OPT_NEG(unset);
> + BUG_ON_OPT_ARG(arg);
> +
> -+ opts->empty = EMPTY_KEEP;
> + opts->type = REBASE_INTERACTIVE;
> + return 0;
> +}
> @@ -201,62 +132,28 @@
> - OPT_BOOL(0, "keep-empty", &opts.keep_empty, N_("keep empty commits")),
> + { OPTION_CALLBACK, 'k', "keep-empty", &options, NULL,
> + N_("(DEPRECATED) keep empty commits"),
> -+ PARSE_OPT_NOARG | PARSE_OPT_NONEG | PARSE_OPT_HIDDEN,
> ++ PARSE_OPT_NOARG | PARSE_OPT_HIDDEN,
> + parse_opt_keep_empty },
> - OPT_BOOL(0, "allow-empty-message", &opts.allow_empty_message,
> - N_("allow commits with empty messages")),
> - OPT_BOOL(0, "rebase-merges", &opts.rebase_merges, N_("rebase merge commits")),
> + OPT_BOOL_F(0, "allow-empty-message", &opts.allow_empty_message,
> + N_("allow commits with empty messages"),
> + PARSE_OPT_HIDDEN),
> @@
> opts->allow_rerere_autoupdate ?
> opts->allow_rerere_autoupdate == RERERE_AUTOUPDATE ?
> "--rerere-autoupdate" : "--no-rerere-autoupdate" : "");
> - add_var(&script_snippet, "keep_empty", opts->keep_empty ? "yes" : "");
> -+ add_var(&script_snippet, "empty", opts->empty == EMPTY_KEEP ? "yes" : "");
> add_var(&script_snippet, "autosquash", opts->autosquash ? "t" : "");
> add_var(&script_snippet, "gpg_sign_opt", opts->gpg_sign_opt);
> add_var(&script_snippet, "cmd", opts->cmd);
> -@@
> - return 0;
> - }
> -
> -+static enum empty_type parse_empty_value(const char *value)
> -+{
> -+ if (!strcasecmp(value, "drop"))
> -+ return EMPTY_DROP;
> -+ else if (!strcasecmp(value, "keep"))
> -+ return EMPTY_KEEP;
> -+ else if (!strcasecmp(value, "ask"))
> -+ return EMPTY_ASK;
> -+
> -+ die(_("unrecognized empty type '%s'; valid values are \"drop\", \"keep\", and \"ask\"."), value);
> -+}
> -+
> -+static int parse_opt_empty(const struct option *opt, const char *arg, int unset)
> -+{
> -+ struct rebase_options *options = opt->value;
> -+ enum empty_type value = parse_empty_value(arg);
> -+
> -+ BUG_ON_OPT_NEG(unset);
> -+
> -+ options->empty = value;
> -+ return 0;
> -+}
> -+
> - static void NORETURN error_on_missing_default_upstream(void)
> - {
> - struct branch *current_branch = branch_get(NULL);
> @@
> "ignoring them"),
> REBASE_PRESERVE_MERGES, PARSE_OPT_HIDDEN),
> OPT_RERERE_AUTOUPDATE(&options.allow_rerere_autoupdate),
> - OPT_BOOL('k', "keep-empty", &options.keep_empty,
> - N_("preserve empty commits during rebase")),
> -+ OPT_CALLBACK_F(0, "empty", &options, N_("{drop,keep,ask}"),
> -+ N_("how to handle empty commits"),
> -+ PARSE_OPT_NONEG, parse_opt_empty),
> + { OPTION_CALLBACK, 'k', "keep-empty", &options, NULL,
> + N_("(DEPRECATED) keep empty commits"),
> -+ PARSE_OPT_NOARG | PARSE_OPT_NONEG | PARSE_OPT_HIDDEN,
> ++ PARSE_OPT_NOARG | PARSE_OPT_HIDDEN,
> + parse_opt_keep_empty },
> OPT_BOOL(0, "autosquash", &options.autosquash,
> N_("move commits that begin with "
> @@ -267,26 +164,10 @@
>
> - if (options.keep_empty)
> - imply_interactive(&options, "--keep-empty");
> -+ if (options.empty != EMPTY_UNSPECIFIED)
> -+ imply_interactive(&options, "--empty");
> -
> +-
> if (gpg_sign) {
> free(options.gpg_sign_opt);
> -@@
> - break;
> - }
> -
> -+ if (options.empty == EMPTY_UNSPECIFIED) {
> -+ if (options.flags & REBASE_INTERACTIVE_EXPLICIT)
> -+ options.empty = EMPTY_ASK;
> -+ else if (exec.nr > 0)
> -+ options.empty = EMPTY_KEEP;
> -+ else
> -+ options.empty = EMPTY_DROP;
> -+ }
> - if (reschedule_failed_exec > 0 && !is_interactive(&options))
> - die(_("--reschedule-failed-exec requires "
> - "--exec or --interactive"));
> + options.gpg_sign_opt = xstrfmt("-S%s", gpg_sign);
>
> diff --git a/rebase-interactive.c b/rebase-interactive.c
> --- a/rebase-interactive.c
> @@ -296,19 +177,22 @@
> }
>
> -void append_todo_help(unsigned keep_empty, int command_count,
> -+void append_todo_help(unsigned no_ask_empty, int command_count,
> ++void append_todo_help(int command_count,
> const char *shortrevisions, const char *shortonto,
> struct strbuf *buf)
> {
> @@
> + "the rebase will be aborted.\n\n");
>
> strbuf_add_commented_lines(buf, msg, strlen(msg));
> -
> +-
> - if (!keep_empty) {
> -+ if (!no_ask_empty) {
> - msg = _("Note that empty commits are commented out");
> - strbuf_add_commented_lines(buf, msg, strlen(msg));
> - }
> +- msg = _("Note that empty commits are commented out");
> +- strbuf_add_commented_lines(buf, msg, strlen(msg));
> +- }
> + }
> +
> + int edit_todo_list(struct repository *r, struct todo_list *todo_list,
>
> diff --git a/rebase-interactive.h b/rebase-interactive.h
> --- a/rebase-interactive.h
> @@ -318,7 +202,7 @@
> struct todo_list;
>
> -void append_todo_help(unsigned keep_empty, int command_count,
> -+void append_todo_help(unsigned no_ask_empty, int command_count,
> ++void append_todo_help(int command_count,
> const char *shortrevisions, const char *shortonto,
> struct strbuf *buf);
> int edit_todo_list(struct repository *r, struct todo_list *todo_list,
> @@ -327,157 +211,51 @@
> --- a/sequencer.c
> +++ b/sequencer.c
> @@
> - static GIT_PATH_FUNC(rebase_path_strategy_opts, "rebase-merge/strategy_opts")
> - static GIT_PATH_FUNC(rebase_path_allow_rerere_autoupdate, "rebase-merge/allow_rerere_autoupdate")
> - static GIT_PATH_FUNC(rebase_path_reschedule_failed_exec, "rebase-merge/reschedule-failed-exec")
> -+static GIT_PATH_FUNC(rebase_path_drop_redundant_commits, "rebase-merge/drop_redundant_commits")
> -+static GIT_PATH_FUNC(rebase_path_keep_redundant_commits, "rebase-merge/keep_redundant_commits")
> -+static GIT_PATH_FUNC(rebase_path_ask_on_initially_empty, "rebase-merge/ask_on_initially_empty")
> -
> - static int git_sequencer_config(const char *k, const char *v, void *cb)
> + struct replay_opts *opts,
> + struct commit *commit)
> {
> +- int index_unchanged, empty_commit;
> ++ int index_unchanged, originally_empty;
> +
> + /*
> + * Three cases:
> @@
> - empty_commit = is_original_commit_empty(commit);
> - if (empty_commit < 0)
> - return empty_commit;
> + if (opts->keep_redundant_commits)
> + return 1;
> +
> +- empty_commit = is_original_commit_empty(commit);
> +- if (empty_commit < 0)
> +- return empty_commit;
> - if (!empty_commit)
> -+ if (!empty_commit || opts->ask_on_initially_empty)
> ++ originally_empty = is_original_commit_empty(commit);
> ++ if (originally_empty < 0)
> ++ return originally_empty;
> ++ if (!originally_empty)
> return 0;
> else
> return 1;
> -@@
> - char *author = NULL;
> - struct commit_message msg = { NULL, NULL, NULL, NULL };
> - struct strbuf msgbuf = STRBUF_INIT;
> -- int res, unborn = 0, reword = 0, allow;
> -+ int res, unborn = 0, reword = 0, allow, drop_commit;
> -
> - if (opts->no_commit) {
> - /*
> -@@
> - goto leave;
> - }
> -
> -- allow = allow_empty(r, opts, commit);
> -- if (allow < 0) {
> -- res = allow;
> -- goto leave;
> -- } else if (allow)
> -- flags |= ALLOW_EMPTY;
> -- if (!opts->no_commit) {
> -+ drop_commit = 0;
> -+ if (opts->drop_redundant_commits && is_index_unchanged(r)) {
> -+ drop_commit = 1;
> -+ fprintf(stderr, _("No changes -- Patch already applied."));
> -+ } else {
> -+ allow = allow_empty(r, opts, commit);
> -+ if (allow < 0) {
> -+ res = allow;
> -+ goto leave;
> -+ } else if (allow) {
> -+ flags |= ALLOW_EMPTY;
> -+ }
> -+ }
> -+ if (!opts->no_commit && !drop_commit) {
> - if (author || command == TODO_REVERT || (flags & AMEND_MSG))
> - res = do_commit(r, msg_file, author, opts, flags);
> - else
> -@@
> - else if (!strcmp(key, "options.allow-empty-message"))
> - opts->allow_empty_message =
> - git_config_bool_or_int(key, value, &error_flag);
> -+ else if (!strcmp(key, "options.drop-redundant-commits"))
> -+ opts->drop_redundant_commits =
> -+ git_config_bool_or_int(key, value, &error_flag);
> - else if (!strcmp(key, "options.keep-redundant-commits"))
> - opts->keep_redundant_commits =
> - git_config_bool_or_int(key, value, &error_flag);
> -+ else if (!strcmp(key, "options.ask_on_initially_empty"))
> -+ opts->ask_on_initially_empty =
> -+ git_config_bool_or_int(key, value, &error_flag);
> - else if (!strcmp(key, "options.signoff"))
> - opts->signoff = git_config_bool_or_int(key, value, &error_flag);
> - else if (!strcmp(key, "options.record-origin"))
> -@@
> - if (file_exists(rebase_path_reschedule_failed_exec()))
> - opts->reschedule_failed_exec = 1;
> -
> -+ if (file_exists(rebase_path_drop_redundant_commits()))
> -+ opts->drop_redundant_commits = 1;
> -+
> -+ if (file_exists(rebase_path_keep_redundant_commits()))
> -+ opts->keep_redundant_commits = 1;
> -+
> -+ if (file_exists(rebase_path_ask_on_initially_empty()))
> -+ opts->ask_on_initially_empty = 1;
> -+
> - read_strategy_opts(opts, &buf);
> - strbuf_release(&buf);
> -
> -@@
> - write_file(rebase_path_cdate_is_adate(), "%s", "");
> - if (opts->ignore_date)
> - write_file(rebase_path_ignore_date(), "%s", "");
> -+ if (opts->drop_redundant_commits)
> -+ write_file(rebase_path_drop_redundant_commits(), "%s", "");
> -+ if (opts->keep_redundant_commits)
> -+ write_file(rebase_path_keep_redundant_commits(), "%s", "");
> -+ if (opts->ask_on_initially_empty)
> -+ write_file(rebase_path_ask_on_initially_empty(), "%s", "");
> - if (opts->reschedule_failed_exec)
> - write_file(rebase_path_reschedule_failed_exec(), "%s", "");
> -
> -@@
> - if (opts->allow_empty_message)
> - res |= git_config_set_in_file_gently(opts_file,
> - "options.allow-empty-message", "true");
> -+ if (opts->drop_redundant_commits)
> -+ res |= git_config_set_in_file_gently(opts_file,
> -+ "options.drop-redundant-commits", "true");
> - if (opts->keep_redundant_commits)
> - res |= git_config_set_in_file_gently(opts_file,
> - "options.keep-redundant-commits", "true");
> -+ if (opts->ask_on_initially_empty)
> -+ res |= git_config_set_in_file_gently(opts_file,
> -+ "options.ask_on_initially_empty", "true");
> - if (opts->signoff)
> - res |= git_config_set_in_file_gently(opts_file,
> - "options.signoff", "true");
> @@
> struct rev_info *revs, struct strbuf *out,
> unsigned flags)
> {
> - int keep_empty = flags & TODO_LIST_KEEP_EMPTY;
> -+ int drop_empty = flags & TODO_LIST_DROP_EMPTY;
> -+ int ask_empty = flags & TODO_LIST_ASK_EMPTY;
> int rebase_cousins = flags & TODO_LIST_REBASE_COUSINS;
> int root_with_onto = flags & TODO_LIST_ROOT_WITH_ONTO;
> struct strbuf buf = STRBUF_INIT, oneline = STRBUF_INIT;
> -@@
> - is_empty = is_original_commit_empty(commit);
> - if (!is_empty && (commit->object.flags & PATCHSAME))
> - continue;
> -+ if (is_empty && drop_empty)
> -+ continue;
> -
> - strbuf_reset(&oneline);
> - pretty_print_commit(pp, commit, &oneline);
> @@
> if (!to_merge) {
> /* non-merge commit: easy case */
> strbuf_reset(&buf);
> - if (!keep_empty && is_empty)
> -+ if (is_empty && ask_empty)
> - strbuf_addf(&buf, "%c ", comment_line_char);
> +- strbuf_addf(&buf, "%c ", comment_line_char);
> strbuf_addf(&buf, "%s %s %s", cmd_pick,
> oid_to_hex(&commit->object.oid),
> + oneline.buf);
> @@
> struct pretty_print_context pp = {0};
> struct rev_info revs;
> struct commit *commit;
> - int keep_empty = flags & TODO_LIST_KEEP_EMPTY;
> -+ int drop_empty = flags & TODO_LIST_DROP_EMPTY;
> -+ int ask_empty = flags & TODO_LIST_ASK_EMPTY;
> const char *insn = flags & TODO_LIST_ABBREVIATE_CMDS ? "p" : "pick";
> int rebase_merges = flags & TODO_LIST_REBASE_MERGES;
>
> @@ -491,19 +269,16 @@
> if (!is_empty && (commit->object.flags & PATCHSAME))
> continue;
> - if (!keep_empty && is_empty)
> -+ if (is_empty && drop_empty)
> -+ continue;
> -+ if (is_empty && ask_empty)
> - strbuf_addf(out, "%c ", comment_line_char);
> +- strbuf_addf(out, "%c ", comment_line_char);
> strbuf_addf(out, "%s %s ", insn,
> oid_to_hex(&commit->object.oid));
> + pretty_print_commit(&pp, commit, out);
> @@
>
> todo_list_to_strbuf(r, todo_list, &buf, num, flags);
> if (flags & TODO_LIST_APPEND_TODO_HELP)
> - append_todo_help(flags & TODO_LIST_KEEP_EMPTY, count_commands(todo_list),
> -+ append_todo_help(!(flags & TODO_LIST_ASK_EMPTY),
> -+ count_commands(todo_list),
> ++ append_todo_help(count_commands(todo_list),
> shortrevisions, shortonto, &buf);
>
> res = write_message(buf.buf, buf.len, file, 0);
> @@ -511,16 +286,6 @@
> diff --git a/sequencer.h b/sequencer.h
> --- a/sequencer.h
> +++ b/sequencer.h
> -@@
> - int allow_rerere_auto;
> - int allow_empty;
> - int allow_empty_message;
> -+ int drop_redundant_commits;
> - int keep_redundant_commits;
> -+ int ask_on_initially_empty;
> - int verbose;
> - int quiet;
> - int reschedule_failed_exec;
> @@
> int sequencer_skip(struct repository *repo, struct replay_opts *opts);
> int sequencer_remove_state(struct replay_opts *opts);
> @@ -530,19 +295,34 @@
> #define TODO_LIST_SHORTEN_IDS (1U << 1)
> #define TODO_LIST_ABBREVIATE_CMDS (1U << 2)
> #define TODO_LIST_REBASE_MERGES (1U << 3)
> -@@
> - * `--onto`, we do not want to re-generate the root commits.
> - */
> - #define TODO_LIST_ROOT_WITH_ONTO (1U << 6)
> -+#define TODO_LIST_DROP_EMPTY (1U << 7)
> -+#define TODO_LIST_ASK_EMPTY (1U << 8)
> -
> -
> - int sequencer_make_script(struct repository *r, struct strbuf *out, int argc,
>
> diff --git a/t/t3421-rebase-topology-linear.sh b/t/t3421-rebase-topology-linear.sh
> --- a/t/t3421-rebase-topology-linear.sh
> +++ b/t/t3421-rebase-topology-linear.sh
> +@@
> + test_run_rebase () {
> + result=$1
> + shift
> +- test_expect_$result "rebase $* drops empty commit" "
> ++ test_expect_$result "rebase $* keeps begin-empty commits" "
> + reset_rebase &&
> +- git rebase $* c l &&
> +- test_cmp_rev c HEAD~2 &&
> +- test_linear_range 'd l' c..
> ++ git rebase $* j l &&
> ++ test_cmp_rev c HEAD~4 &&
> ++ test_linear_range 'j d k l' c..
> + "
> + }
> +-test_run_rebase success ''
> ++test_run_rebase failure ''
> + test_run_rebase success -m
> + test_run_rebase success -i
> +-test_have_prereq !REBASE_P || test_run_rebase success -p
> ++test_have_prereq !REBASE_P || test_run_rebase failure -p
> +
> + test_run_rebase () {
> + result=$1
> @@
> test_run_rebase success ''
> test_run_rebase success -m
> @@ -603,31 +383,22 @@
> + git commit -m "Five letters ought to be enough for anybody"
> +'
> +
> -+test_expect_success 'rebase --merge --empty=drop' '
> ++test_expect_failure 'rebase (am-backend) with a variety of empty commits' '
> ++ test_when_finished "git rebase --abort" &&
> + git checkout -B testing localmods &&
> -+ git rebase --merge --empty=drop upstream &&
> -+
> -+ test_write_lines C B A >expect &&
> -+ git log --format=%s >actual &&
> -+ test_cmp expect actual
> -+'
> ++ # rebase (--am) should not drop commits that start empty
> ++ git rebase upstream &&
> +
> -+test_expect_success 'rebase --merge --empty=keep' '
> -+ git checkout -B testing localmods &&
> -+ git rebase --merge --empty=keep upstream &&
> -+
> -+ test_write_lines D C2 C B A >expect &&
> ++ test_write_lines D C B A >expect &&
> + git log --format=%s >actual &&
> + test_cmp expect actual
> +'
> +
> -+test_expect_success 'rebase --merge --empty=ask' '
> ++test_expect_failure 'rebase --merge with a variety of empty commits' '
> ++ test_when_finished "git rebase --abort" &&
> + git checkout -B testing localmods &&
> -+ test_must_fail git rebase --merge --empty=ask upstream &&
> -+
> -+ test_must_fail git rebase --skip &&
> -+ git commit --allow-empty &&
> -+ git rebase --continue &&
> ++ # rebase --merge should not halt on the commit that becomes empty
> ++ git rebase --merge upstream &&
> +
> + test_write_lines D C B A >expect &&
> + git log --format=%s >actual &&
> @@ -636,25 +407,17 @@
> +
> +GIT_SEQUENCE_EDITOR=: && export GIT_SEQUENCE_EDITOR
> +
> -+test_expect_success 'rebase --interactive --empty=drop' '
> ++test_expect_success 'rebase --interactive with a variety of empty commits' '
> + git checkout -B testing localmods &&
> -+ git rebase --interactive --empty=drop upstream &&
> ++ test_must_fail git rebase --interactive upstream &&
> +
> -+ test_write_lines C B A >expect &&
> -+ git log --format=%s >actual &&
> -+ test_cmp expect actual
> -+'
> -+
> -+test_expect_success 'rebase --interactive --empty=keep' '
> -+ git checkout -B testing localmods &&
> -+ git rebase --interactive --empty=keep upstream &&
> ++ git rebase --skip &&
> +
> -+ test_write_lines D C2 C B A >expect &&
> ++ test_write_lines D C B A >expect &&
> + git log --format=%s >actual &&
> + test_cmp expect actual
> +'
> +
> -+
> +test_done
>
> diff --git a/t/t3427-rebase-subtree.sh b/t/t3427-rebase-subtree.sh
> @@ -665,32 +428,28 @@
> '
>
> -test_expect_success 'Rebase -Xsubtree --keep-empty --onto commit' '
> -+test_expect_success 'Rebase -Xsubtree --empty=ask --onto commit' '
> ++test_expect_success 'Rebase -Xsubtree --onto commit' '
> reset_rebase &&
> git checkout -b rebase-onto to-rebase &&
> - test_must_fail git rebase -Xsubtree=files_subtree --keep-empty --onto files-master master &&
> -+ test_must_fail git rebase -Xsubtree=files_subtree --empty=ask --onto files-master master &&
> ++ test_must_fail git rebase -Xsubtree=files_subtree --onto files-master master &&
> : first pick results in no changes &&
> - git rebase --continue &&
> -+ test_must_fail git rebase --skip &&
> -+ : last pick was an empty commit that has no changes, but we want to keep it &&
> -+ git commit --allow-empty &&
> ++ git rebase --skip &&
> verbose test "$(commit_message HEAD~2)" = "master4" &&
> verbose test "$(commit_message HEAD~)" = "files_subtree/master5" &&
> verbose test "$(commit_message HEAD)" = "Empty commit"
> '
>
> -test_expect_success 'Rebase -Xsubtree --keep-empty --rebase-merges --onto commit' '
> -+test_expect_success 'Rebase -Xsubtree --empty=ask --rebase-merges --onto commit' '
> ++test_expect_success 'Rebase -Xsubtree --rebase-merges --onto commit' '
> reset_rebase &&
> git checkout -b rebase-merges-onto to-rebase &&
> - test_must_fail git rebase -Xsubtree=files_subtree --keep-empty --rebase-merges --onto files-master --root &&
> -+ test_must_fail git rebase -Xsubtree=files_subtree --empty=ask --rebase-merges --onto files-master --root &&
> ++ test_must_fail git rebase -Xsubtree=files_subtree --rebase-merges --onto files-master --root &&
> : first pick results in no changes &&
> - git rebase --continue &&
> -+ test_must_fail git rebase --skip &&
> -+ : last pick was an empty commit that has no changes, but we want to keep it &&
> -+ git commit --allow-empty &&
> ++ git rebase --skip &&
> verbose test "$(commit_message HEAD~2)" = "master4" &&
> verbose test "$(commit_message HEAD~)" = "files_subtree/master5" &&
> verbose test "$(commit_message HEAD)" = "Empty commit"
> -: ---------- > 4: c9542a2abe rebase (interactive-backend): fix handling of commits that become empty
> 2: bd3c5ec155 = 5: 9f66229d5c t3406: simplify an already simple test
> 3: 49388b79fd = 6: 8d731fa39c rebase, sequencer: remove the broken GIT_QUIET handling
> 4: 478479358f ! 7: b6b6597eef rebase: make sure to pass along the quiet flag to the sequencer
> @@ -8,13 +8,13 @@
> --- a/builtin/rebase.c
> +++ b/builtin/rebase.c
> @@
> + replay.allow_empty_message = opts->allow_empty_message;
> + replay.drop_redundant_commits = (opts->empty == EMPTY_DROP);
> replay.keep_redundant_commits = (opts->empty == EMPTY_KEEP);
> - replay.ask_on_initially_empty = (opts->empty == EMPTY_ASK &&
> - !(opts->flags & REBASE_INTERACTIVE_EXPLICIT));
> + replay.quiet = !(opts->flags & REBASE_NO_QUIET);
> replay.verbose = opts->flags & REBASE_VERBOSE;
> replay.reschedule_failed_exec = opts->reschedule_failed_exec;
> - replay.committer_date_is_author_date =
> + replay.gpg_sign = xstrdup_or_null(opts->gpg_sign_opt);
> @@
> N_("allow pre-rebase hook to run")),
> OPT_NEGBIT('q', "quiet", &options.flags,
> 5: ee26f5a161 = 8: 0acefa988b rebase: fix handling of restrict_revision
> 6: 34a69def33 = 9: 8c5b5b5133 t3432: make these tests work with either am or merge backends
> 7: f2c92853b4 ! 10: b8c087d6fb rebase: allow more types of rebases to fast-forward
> @@ -35,8 +35,8 @@
> OPT_STRING(0, "onto", &options.onto_name,
> N_("revision"),
> @@
> - options.ignore_date)
> - options.flags |= REBASE_FORCE;
> + state_dir_base, cmd_live_rebase, buf.buf);
> + }
>
> + if ((options.flags & REBASE_INTERACTIVE_EXPLICIT) ||
> + (action != ACTION_NONE) ||
> @@ -47,7 +47,9 @@
> +
> for (i = 0; i < options.git_am_opts.argc; i++) {
> const char *option = options.git_am_opts.argv[i], *p;
> - if (!strcmp(option, "--whitespace=fix") ||
> + if (!strcmp(option, "--committer-date-is-author-date") ||
> + !strcmp(option, "--ignore-date") ||
> + !strcmp(option, "--whitespace=fix") ||
> !strcmp(option, "--whitespace=strip"))
> - options.flags |= REBASE_FORCE;
> + allow_preemptive_ff = 0;
> 8: b307340f7c ! 11: b50a1741e0 git-rebase.txt: add more details about behavioral differences of backends
> @@ -8,23 +8,24 @@
> --- a/Documentation/git-rebase.txt
> +++ b/Documentation/git-rebase.txt
> @@
> - with `--keep-base` in order to drop those commits from your branch.
>
> --ignore-whitespace::
> -- Behaves differently depending on which backend is selected.
> --+
> --'am' backend: When applying a patch, ignore changes in whitespace in
> --context lines if necessary.
> --+
> --'interactive' backend: Treat lines with only whitespace changes as
> --unchanged for the sake of a three-way merge.
> -+ Ignore whitespace-only changes in the commits being rebased,
> -+ which may avoid "unnecessary" conflicts. (Both backends
> -+ currently have differing edgecase bugs with this option; see
> -+ BEHAVIORAL DIFFERENCES.)
> -
> --whitespace=<option>::
> - This flag is passed to the 'git apply' program
> +- These flag are passed to the 'git apply' program
> ++ These flags are passed to the 'git apply' program
> + (see linkgit:git-apply[1]) that applies the patch.
> + +
> + See also INCOMPATIBLE OPTIONS below.
> +@@
> +
> + * --committer-date-is-author-date
> + * --ignore-date
> +- * --whitespace
> + * --ignore-whitespace
> ++ * --whitespace
> + * -C
> +
> + are incompatible with the following options:
> @@
> Directory rename detection
> ~~~~~~~~~~~~~~~~~~~~~~~~~~
> @@ -82,24 +83,14 @@
> +The interactive backend works with the full commits on both sides of
> +history and thus has no such limitations.
> +
> -+--ignore-whitespace
> -+~~~~~~~~~~~~~~~~~~~
> ++Hooks
> ++~~~~~
> +
> -+The --ignore-whitespace option is supposed to ignore whitespace-only
> -+changes if it allows the code to merge cleanly. Unfortunately, the
> -+different backends implement this differently, and both have different
> -+edge case bugs.
> -++
> -+'am' backend: When applying a patch, ignore changes in whitespace in
> -+context lines if necessary. (Which implies that if the whitespace
> -+change was not in the context lines but on a line with a real change,
> -+then the rebase will still fail with "unnecessary" content conflicts.)
> -++
> -+'interactive' backend: Treat lines with only whitespace changes as
> -+unchanged for the sake of a three-way merge. This means that if one
> -+side made no changes and the commits being rebased had whitespace-only
> -+changes, those whitespaces fixups will be discarded despite the fact
> -+that they present no content conflict.
> ++The am backend has not traditionally called the post-commit hook,
> ++while the merge/interactive backend has. However, this was by
> ++accident of implementation rather than by design. Both backends
> ++should have the same behavior, though it is not clear which one is
> ++correct.
> +
> +Miscellaneous differences
> +~~~~~~~~~~~~~~~~~~~~~~~~~
> @@ -123,19 +114,3 @@
>
> include::merge-strategies.txt[]
>
> -
> - diff --git a/t/t3433-rebase-options-compatibility.sh b/t/t3433-rebase-options-compatibility.sh
> - --- a/t/t3433-rebase-options-compatibility.sh
> - +++ b/t/t3433-rebase-options-compatibility.sh
> -@@
> - GIT_AUTHOR_DATE="1999-04-02T08:03:20+05:30"
> - export GIT_AUTHOR_DATE
> -
> --# This is a special case in which both am and interactive backends
> --# provide the same output. It was done intentionally because
> --# both the backends fall short of optimal behaviour.
> -+# This is a common case in which both am and interactive backends
> -+# provide the same output with --ignore-whitespace.
> - test_expect_success 'setup' '
> - git checkout -b topic &&
> - q_to_tab >file <<-\EOF &&
> 9: 7c3f2e07f3 = 12: 58e6e4ffb3 rebase: move incompatibility checks between backend options a bit earlier
> 10: 1df11f0b51 ! 13: 5478c730ac rebase: add an --am option
> @@ -24,8 +24,8 @@
> +See also INCOMPATIBLE OPTIONS below.
> +
> --empty={drop,keep,ask}::
> - How to handle commits that become empty (because they contain a
> - subset of already upstream changes) or start empty. With drop
> + How to handle commits that are not empty to start and are not
> + clean cherry-picks of any upstream commit, but which become
> @@
> Ensure at least <n> lines of surrounding context match before
> and after each change. When fewer lines of surrounding
> @@ -37,7 +37,7 @@
>
> @@
> --whitespace=<option>::
> - This flag is passed to the 'git apply' program
> + These flags are passed to the 'git apply' program
> (see linkgit:git-apply[1]) that applies the patch.
> + Implies --am.
> +
> @@ -48,9 +48,9 @@
> The following options:
>
> + * --am
> - * --whitespace
> - * -C
> -
> + * --committer-date-is-author-date
> + * --ignore-date
> + * --ignore-whitespace
>
> diff --git a/builtin/rebase.c b/builtin/rebase.c
> --- a/builtin/rebase.c
> 11: ff43593211 = 14: db5e29bd81 git-prompt: change the prompt for interactive-based rebases
> -: ---------- > 15: 413e190ac9 rebase: drop '-i' from the reflog for interactive-based rebases
> 12: 99388f24e5 ! 16: 170be283a8 rebase tests: mark tests specific to the am-backend with --am
> @@ -228,40 +228,6 @@
> test_rebase_same_head_ $status_f $what_f $cmp_f " --merge --no-ff" "$*"
> }
>
> - diff --git a/t/t3433-rebase-options-compatibility.sh b/t/t3433-rebase-options-compatibility.sh
> - --- a/t/t3433-rebase-options-compatibility.sh
> - +++ b/t/t3433-rebase-options-compatibility.sh
> -@@
> - new line 2
> - line 3
> - EOF
> -- test_must_fail git rebase main side &&
> -+ test_must_fail git rebase --am main side &&
> - git rebase --abort &&
> -- git rebase --ignore-whitespace main side &&
> -+ git rebase --am --ignore-whitespace main side &&
> - test_cmp expect file
> - '
> -
> -@@
> -
> - test_expect_success '--committer-date-is-author-date works with am backend' '
> - git commit --amend &&
> -- git rebase --committer-date-is-author-date HEAD^ &&
> -+ git rebase --am --committer-date-is-author-date HEAD^ &&
> - git show HEAD --pretty="format:%ai" >authortime &&
> - git show HEAD --pretty="format:%ci" >committertime &&
> - test_cmp authortime committertime
> -@@
> - # sets to +0530.
> - test_expect_success '--ignore-date works with am backend' '
> - git commit --amend --date="$GIT_AUTHOR_DATE" &&
> -- git rebase --ignore-date HEAD^ &&
> -+ git rebase --am --ignore-date HEAD^ &&
> - git show HEAD --pretty="format:%ai" >authortime &&
> - grep "+0000" authortime
> - '
> -
> diff --git a/t/t5407-post-rewrite-hook.sh b/t/t5407-post-rewrite-hook.sh
> --- a/t/t5407-post-rewrite-hook.sh
> +++ b/t/t5407-post-rewrite-hook.sh
> 13: c2ba6317bf = 17: 1e3d4066c4 rebase tests: repeat some tests using the merge backend instead of am
> 14: 8bec6df51a = 18: 9b4ac83d2d rebase: make the backend configurable via config setting
> 15: 044853fd61 = 19: 859a4a94d7 rebase: change the default backend from "am" to "merge"
>
next prev parent reply other threads:[~2020-01-17 16:58 UTC|newest]
Thread overview: 161+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-12-20 17:09 [PATCH 00/15] rebase: make the default backend configurable Elijah Newren via GitGitGadget
2019-12-20 17:09 ` [PATCH 01/15] rebase: extend the options for handling of empty commits Elijah Newren via GitGitGadget
2019-12-20 21:29 ` Junio C Hamano
2019-12-21 0:32 ` Elijah Newren
2019-12-21 18:52 ` Elijah Newren
2019-12-21 23:49 ` Junio C Hamano
2019-12-20 17:09 ` [PATCH 02/15] t3406: simplify an already simple test Elijah Newren via GitGitGadget
2019-12-20 17:09 ` [PATCH 03/15] rebase, sequencer: remove the broken GIT_QUIET handling Elijah Newren via GitGitGadget
2019-12-20 21:34 ` Junio C Hamano
2019-12-20 17:09 ` [PATCH 04/15] rebase: make sure to pass along the quiet flag to the sequencer Elijah Newren via GitGitGadget
2019-12-20 17:09 ` [PATCH 05/15] rebase: fix handling of restrict_revision Elijah Newren via GitGitGadget
2019-12-20 21:37 ` Junio C Hamano
2019-12-20 17:09 ` [PATCH 06/15] t3432: make these tests work with either am or merge backends Elijah Newren via GitGitGadget
2019-12-22 5:11 ` Denton Liu
2019-12-23 17:17 ` Elijah Newren
2019-12-20 17:09 ` [PATCH 07/15] rebase: allow more types of rebases to fast-forward Elijah Newren via GitGitGadget
2019-12-20 17:09 ` [PATCH 08/15] git-rebase.txt: add more details about behavioral differences of backends Elijah Newren via GitGitGadget
2019-12-20 17:09 ` [PATCH 09/15] rebase: move incompatibility checks between backend options a bit earlier Elijah Newren via GitGitGadget
2019-12-20 17:09 ` [PATCH 10/15] rebase: add an --am option Elijah Newren via GitGitGadget
2019-12-20 17:09 ` [PATCH 11/15] contrib: change the prompt for am-based rebases Elijah Newren via GitGitGadget
2019-12-20 23:07 ` SZEDER Gábor
2019-12-21 0:17 ` Elijah Newren
2019-12-20 17:09 ` [PATCH 12/15] rebase tests: mark tests specific to the am-backend with --am Elijah Newren via GitGitGadget
2019-12-20 17:09 ` [PATCH 13/15] rebase tests: repeat some tests using the merge backend instead of am Elijah Newren via GitGitGadget
2019-12-20 17:09 ` [PATCH 14/15] rebase: make the backend configurable via config setting Elijah Newren via GitGitGadget
2019-12-20 17:09 ` [PATCH 15/15] rebase: change the default backend from "am" to "merge" Elijah Newren via GitGitGadget
2019-12-20 18:51 ` [PATCH 00/15] rebase: make the default backend configurable Alban Gruin
2019-12-20 18:55 ` Elijah Newren
2019-12-23 18:49 ` [PATCH v2 " Elijah Newren via GitGitGadget
2019-12-23 18:49 ` [PATCH v2 01/15] rebase: extend the options for handling of empty commits Elijah Newren via GitGitGadget
2019-12-23 18:49 ` [PATCH v2 02/15] t3406: simplify an already simple test Elijah Newren via GitGitGadget
2019-12-23 18:49 ` [PATCH v2 03/15] rebase, sequencer: remove the broken GIT_QUIET handling Elijah Newren via GitGitGadget
2019-12-23 18:49 ` [PATCH v2 04/15] rebase: make sure to pass along the quiet flag to the sequencer Elijah Newren via GitGitGadget
2019-12-23 18:49 ` [PATCH v2 05/15] rebase: fix handling of restrict_revision Elijah Newren via GitGitGadget
2019-12-23 18:49 ` [PATCH v2 06/15] t3432: make these tests work with either am or merge backends Elijah Newren via GitGitGadget
2019-12-23 18:49 ` [PATCH v2 07/15] rebase: allow more types of rebases to fast-forward Elijah Newren via GitGitGadget
2019-12-23 18:49 ` [PATCH v2 08/15] git-rebase.txt: add more details about behavioral differences of backends Elijah Newren via GitGitGadget
2019-12-23 18:49 ` [PATCH v2 09/15] rebase: move incompatibility checks between backend options a bit earlier Elijah Newren via GitGitGadget
2019-12-23 18:49 ` [PATCH v2 10/15] rebase: add an --am option Elijah Newren via GitGitGadget
2019-12-23 18:49 ` [PATCH v2 11/15] contrib: change the prompt for interactive-based rebases Elijah Newren via GitGitGadget
2019-12-23 22:00 ` Denton Liu
2019-12-23 18:49 ` [PATCH v2 12/15] rebase tests: mark tests specific to the am-backend with --am Elijah Newren via GitGitGadget
2019-12-23 18:49 ` [PATCH v2 13/15] rebase tests: repeat some tests using the merge backend instead of am Elijah Newren via GitGitGadget
2019-12-23 18:49 ` [PATCH v2 14/15] rebase: make the backend configurable via config setting Elijah Newren via GitGitGadget
2019-12-23 18:49 ` [PATCH v2 15/15] rebase: change the default backend from "am" to "merge" Elijah Newren via GitGitGadget
2019-12-24 19:54 ` [PATCH v3 00/15] rebase: make the default backend configurable Elijah Newren via GitGitGadget
2019-12-24 19:54 ` [PATCH v3 01/15] rebase: extend the options for handling of empty commits Elijah Newren via GitGitGadget
2020-01-07 14:37 ` Phillip Wood
2020-01-07 19:15 ` Elijah Newren
2020-01-08 14:27 ` Phillip Wood
2020-01-09 21:32 ` Johannes Schindelin
2019-12-24 19:54 ` [PATCH v3 02/15] t3406: simplify an already simple test Elijah Newren via GitGitGadget
2019-12-24 19:54 ` [PATCH v3 03/15] rebase, sequencer: remove the broken GIT_QUIET handling Elijah Newren via GitGitGadget
2019-12-24 19:54 ` [PATCH v3 04/15] rebase: make sure to pass along the quiet flag to the sequencer Elijah Newren via GitGitGadget
2019-12-24 19:54 ` [PATCH v3 05/15] rebase: fix handling of restrict_revision Elijah Newren via GitGitGadget
2019-12-24 19:54 ` [PATCH v3 06/15] t3432: make these tests work with either am or merge backends Elijah Newren via GitGitGadget
2019-12-24 19:54 ` [PATCH v3 07/15] rebase: allow more types of rebases to fast-forward Elijah Newren via GitGitGadget
2019-12-24 19:54 ` [PATCH v3 08/15] git-rebase.txt: add more details about behavioral differences of backends Elijah Newren via GitGitGadget
2019-12-24 19:54 ` [PATCH v3 09/15] rebase: move incompatibility checks between backend options a bit earlier Elijah Newren via GitGitGadget
2019-12-24 19:54 ` [PATCH v3 10/15] rebase: add an --am option Elijah Newren via GitGitGadget
2020-01-07 14:43 ` Phillip Wood
2020-01-07 19:26 ` Elijah Newren
2020-01-07 20:11 ` Junio C Hamano
2020-01-08 14:32 ` Phillip Wood
2020-01-08 17:18 ` Junio C Hamano
2020-01-08 18:55 ` Phillip Wood
2019-12-24 19:54 ` [PATCH v3 11/15] git-prompt: change the prompt for interactive-based rebases Elijah Newren via GitGitGadget
2019-12-24 19:54 ` [PATCH v3 12/15] rebase tests: mark tests specific to the am-backend with --am Elijah Newren via GitGitGadget
2019-12-24 19:54 ` [PATCH v3 13/15] rebase tests: repeat some tests using the merge backend instead of am Elijah Newren via GitGitGadget
2019-12-24 19:54 ` [PATCH v3 14/15] rebase: make the backend configurable via config setting Elijah Newren via GitGitGadget
2019-12-24 19:54 ` [PATCH v3 15/15] rebase: change the default backend from "am" to "merge" Elijah Newren via GitGitGadget
2020-01-10 23:14 ` Jonathan Nieder
2020-01-11 1:16 ` Elijah Newren
2020-01-11 14:41 ` Phillip Wood
2020-01-12 17:59 ` Johannes Schindelin
2020-01-16 6:32 ` Elijah Newren
2020-01-16 7:58 ` Jonathan Nieder
2020-01-16 8:06 ` Jonathan Nieder
2020-01-16 16:18 ` Elijah Newren
2020-01-16 20:35 ` Jonathan Nieder
2020-01-16 21:30 ` Elijah Newren
2020-01-16 22:39 ` Jonathan Nieder
2020-01-16 23:19 ` Elijah Newren
2020-01-16 23:25 ` Junio C Hamano
2020-01-17 0:51 ` Elijah Newren
2020-01-16 15:35 ` Elijah Newren
2020-01-16 20:05 ` Junio C Hamano
2020-01-16 10:48 ` Johannes Schindelin
2020-01-12 21:23 ` Junio C Hamano
2020-01-15 19:50 ` Jonathan Nieder
2020-01-15 21:59 ` Emily Shaffer
2020-01-16 6:14 ` [PATCH v4 00/19] rebase: make the default backend configurable Elijah Newren via GitGitGadget
2020-01-16 6:14 ` [PATCH v4 01/19] git-rebase.txt: update description of --allow-empty-message Elijah Newren via GitGitGadget
2020-02-09 15:59 ` Phillip Wood
2020-02-13 18:35 ` Elijah Newren
2020-01-16 6:14 ` [PATCH v4 02/19] t3404: directly test the behavior of interest Elijah Newren via GitGitGadget
2020-01-16 6:14 ` [PATCH v4 03/19] rebase (interactive-backend): make --keep-empty the default Elijah Newren via GitGitGadget
2020-02-09 15:59 ` Phillip Wood
2020-02-13 18:52 ` Elijah Newren
2020-01-16 6:14 ` [PATCH v4 04/19] rebase (interactive-backend): fix handling of commits that become empty Elijah Newren via GitGitGadget
2020-02-10 14:27 ` Phillip Wood
2020-02-13 18:54 ` Elijah Newren
2020-02-16 14:46 ` Phillip Wood
2020-01-16 6:14 ` [PATCH v4 05/19] t3406: simplify an already simple test Elijah Newren via GitGitGadget
2020-01-16 6:14 ` [PATCH v4 06/19] rebase, sequencer: remove the broken GIT_QUIET handling Elijah Newren via GitGitGadget
2020-01-16 6:14 ` [PATCH v4 07/19] rebase: make sure to pass along the quiet flag to the sequencer Elijah Newren via GitGitGadget
2020-01-16 6:14 ` [PATCH v4 08/19] rebase: fix handling of restrict_revision Elijah Newren via GitGitGadget
2020-01-16 6:14 ` [PATCH v4 09/19] t3432: make these tests work with either am or merge backends Elijah Newren via GitGitGadget
2020-01-16 6:14 ` [PATCH v4 10/19] rebase: allow more types of rebases to fast-forward Elijah Newren via GitGitGadget
2020-01-16 6:14 ` [PATCH v4 11/19] git-rebase.txt: add more details about behavioral differences of backends Elijah Newren via GitGitGadget
2020-01-16 6:14 ` [PATCH v4 12/19] rebase: move incompatibility checks between backend options a bit earlier Elijah Newren via GitGitGadget
2020-01-16 6:14 ` [PATCH v4 13/19] rebase: add an --am option Elijah Newren via GitGitGadget
2020-01-16 6:14 ` [PATCH v4 14/19] git-prompt: change the prompt for interactive-based rebases Elijah Newren via GitGitGadget
2020-01-16 6:14 ` [PATCH v4 15/19] rebase: drop '-i' from the reflog " Elijah Newren via GitGitGadget
2020-01-16 6:14 ` [PATCH v4 16/19] rebase tests: mark tests specific to the am-backend with --am Elijah Newren via GitGitGadget
2020-01-16 6:14 ` [PATCH v4 17/19] rebase tests: repeat some tests using the merge backend instead of am Elijah Newren via GitGitGadget
2020-01-16 6:14 ` [PATCH v4 18/19] rebase: make the backend configurable via config setting Elijah Newren via GitGitGadget
2020-01-16 6:14 ` [PATCH v4 19/19] rebase: change the default backend from "am" to "merge" Elijah Newren via GitGitGadget
2020-01-17 16:58 ` Phillip Wood [this message]
2020-02-05 21:06 ` [PATCH v4 00/19] rebase: make the default backend configurable Junio C Hamano
2020-02-05 22:38 ` Elijah Newren
2020-02-15 21:36 ` [PATCH v5 00/20] rebase: make the default backend configurable and change the default Elijah Newren via GitGitGadget
2020-02-15 21:36 ` [PATCH v5 01/20] git-rebase.txt: update description of --allow-empty-message Elijah Newren via GitGitGadget
2020-02-15 21:36 ` [PATCH v5 02/20] t3404: directly test the behavior of interest Elijah Newren via GitGitGadget
2020-02-15 21:36 ` [PATCH v5 03/20] rebase (interactive-backend): make --keep-empty the default Elijah Newren via GitGitGadget
2020-02-15 21:36 ` [PATCH v5 04/20] rebase (interactive-backend): fix handling of commits that become empty Elijah Newren via GitGitGadget
2020-02-15 21:36 ` [PATCH v5 05/20] t3406: simplify an already simple test Elijah Newren via GitGitGadget
2020-02-15 21:36 ` [PATCH v5 06/20] rebase, sequencer: remove the broken GIT_QUIET handling Elijah Newren via GitGitGadget
2020-02-15 21:36 ` [PATCH v5 07/20] rebase: make sure to pass along the quiet flag to the sequencer Elijah Newren via GitGitGadget
2020-02-15 21:36 ` [PATCH v5 08/20] rebase: fix handling of restrict_revision Elijah Newren via GitGitGadget
2020-02-15 21:36 ` [PATCH v5 09/20] t3432: make these tests work with either am or merge backends Elijah Newren via GitGitGadget
2020-02-15 21:36 ` [PATCH v5 10/20] rebase: allow more types of rebases to fast-forward Elijah Newren via GitGitGadget
2020-02-15 21:36 ` [PATCH v5 11/20] git-rebase.txt: add more details about behavioral differences of backends Elijah Newren via GitGitGadget
2020-02-15 21:36 ` [PATCH v5 12/20] rebase: move incompatibility checks between backend options a bit earlier Elijah Newren via GitGitGadget
2020-02-15 21:36 ` [PATCH v5 13/20] rebase: add an --am option Elijah Newren via GitGitGadget
2020-02-15 21:36 ` [PATCH v5 14/20] git-prompt: change the prompt for interactive-based rebases Elijah Newren via GitGitGadget
2020-02-15 21:36 ` [PATCH v5 15/20] rebase: drop '-i' from the reflog " Elijah Newren via GitGitGadget
2020-02-15 21:36 ` [PATCH v5 16/20] rebase tests: mark tests specific to the am-backend with --am Elijah Newren via GitGitGadget
2020-02-15 21:36 ` [PATCH v5 17/20] rebase tests: repeat some tests using the merge backend instead of am Elijah Newren via GitGitGadget
2020-02-15 21:36 ` [PATCH v5 18/20] rebase: make the backend configurable via config setting Elijah Newren via GitGitGadget
2020-02-15 21:36 ` [PATCH v5 19/20] rebase: change the default backend from "am" to "merge" Elijah Newren via GitGitGadget
2020-02-15 21:36 ` [PATCH v5 20/20] rebase: rename the two primary rebase backends Elijah Newren via GitGitGadget
2020-03-12 15:13 ` Emily Shaffer
2020-03-12 16:33 ` Elijah Newren
2020-03-12 17:55 ` Jonathan Nieder
2020-03-12 18:39 ` Elijah Newren
2020-03-12 18:46 ` Jonathan Nieder
2020-03-12 19:31 ` Elijah Newren
2020-03-17 2:58 ` Jonathan Nieder
2020-03-17 4:45 ` Elijah Newren
2020-03-12 19:54 ` Junio C Hamano
2020-03-12 19:07 ` Junio C Hamano
2020-03-12 19:12 ` Jonathan Nieder
2020-03-12 19:12 ` Junio C Hamano
2020-03-12 19:29 ` Elijah Newren
2020-03-12 20:37 ` Jeff King
2020-03-12 21:27 ` Junio C Hamano
2020-03-12 22:06 ` Elijah Newren
2020-03-13 0:04 ` Junio C Hamano
2020-03-12 23:30 ` Jonathan Nieder
2020-02-16 15:01 ` [PATCH v5 00/20] rebase: make the default backend configurable and change the default Phillip Wood
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=47e7c9e6-7d83-185d-792d-f8e084c1a7a1@gmail.com \
--to=phillip.wood123@gmail.com \
--cc=Johannes.Schindelin@gmx.de \
--cc=alban.gruin@gmail.com \
--cc=emilyshaffer@google.com \
--cc=git@vger.kernel.org \
--cc=gitgitgadget@gmail.com \
--cc=gitster@pobox.com \
--cc=jrnieder@gmail.com \
--cc=liu.denton@gmail.com \
--cc=newren@gmail.com \
--cc=phillip.wood@dunelm.org.uk \
--cc=plroskin@gmail.com \
--cc=szeder.dev@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).