1
0
mirror of https://github.com/git/git synced 2024-07-07 19:39:27 +00:00

pull: allow interactive rebase with --rebase=interactive

A couple of years ago, I found the need to collaborate on topic
branches that were rebased all the time, and I really needed to see
what I was rebasing when pulling, so I introduced an
interactively-rebasing pull.

The way builtin pull works, this change also supports the value
'interactive' for the 'branch.<name>.rebase' config variable, which
is a neat thing because users can now configure given branches for
interactively-rebasing pulls without having to type out the complete
`--rebase=interactive` option every time they pull.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Johannes Schindelin 2016-01-13 13:17:15 +01:00 committed by Junio C Hamano
parent 754884255b
commit f5eb87b98d
4 changed files with 24 additions and 3 deletions

View File

@ -870,6 +870,8 @@ When preserve, also pass `--preserve-merges` along to 'git rebase'
so that locally committed merge commits will not be flattened so that locally committed merge commits will not be flattened
by running 'git pull'. by running 'git pull'.
+ +
When the value is `interactive`, the rebase is run in interactive mode.
+
*NOTE*: this is a possibly dangerous operation; do *not* use *NOTE*: this is a possibly dangerous operation; do *not* use
it unless you understand the implications (see linkgit:git-rebase[1] it unless you understand the implications (see linkgit:git-rebase[1]
for details). for details).
@ -2149,6 +2151,8 @@ When preserve, also pass `--preserve-merges` along to 'git rebase'
so that locally committed merge commits will not be flattened so that locally committed merge commits will not be flattened
by running 'git pull'. by running 'git pull'.
+ +
When the value is `interactive`, the rebase is run in interactive mode.
+
*NOTE*: this is a possibly dangerous operation; do *not* use *NOTE*: this is a possibly dangerous operation; do *not* use
it unless you understand the implications (see linkgit:git-rebase[1] it unless you understand the implications (see linkgit:git-rebase[1]
for details). for details).

View File

@ -101,7 +101,7 @@ Options related to merging
include::merge-options.txt[] include::merge-options.txt[]
-r:: -r::
--rebase[=false|true|preserve]:: --rebase[=false|true|preserve|interactive]::
When true, rebase the current branch on top of the upstream When true, rebase the current branch on top of the upstream
branch after fetching. If there is a remote-tracking branch branch after fetching. If there is a remote-tracking branch
corresponding to the upstream branch and the upstream branch corresponding to the upstream branch and the upstream branch
@ -113,6 +113,8 @@ to `git rebase` so that locally created merge commits will not be flattened.
+ +
When false, merge the current branch into the upstream branch. When false, merge the current branch into the upstream branch.
+ +
When `interactive`, enable the interactive mode of rebase.
+
See `pull.rebase`, `branch.<name>.rebase` and `branch.autoSetupRebase` in See `pull.rebase`, `branch.<name>.rebase` and `branch.autoSetupRebase` in
linkgit:git-config[1] if you want to make `git pull` always use linkgit:git-config[1] if you want to make `git pull` always use
`--rebase` instead of merging. `--rebase` instead of merging.

View File

@ -22,7 +22,8 @@ enum rebase_type {
REBASE_INVALID = -1, REBASE_INVALID = -1,
REBASE_FALSE = 0, REBASE_FALSE = 0,
REBASE_TRUE, REBASE_TRUE,
REBASE_PRESERVE REBASE_PRESERVE,
REBASE_INTERACTIVE
}; };
/** /**
@ -42,6 +43,8 @@ static enum rebase_type parse_config_rebase(const char *key, const char *value,
return REBASE_TRUE; return REBASE_TRUE;
else if (!strcmp(value, "preserve")) else if (!strcmp(value, "preserve"))
return REBASE_PRESERVE; return REBASE_PRESERVE;
else if (!strcmp(value, "interactive"))
return REBASE_INTERACTIVE;
if (fatal) if (fatal)
die(_("Invalid value for %s: %s"), key, value); die(_("Invalid value for %s: %s"), key, value);
@ -112,7 +115,7 @@ static struct option pull_options[] = {
/* Options passed to git-merge or git-rebase */ /* Options passed to git-merge or git-rebase */
OPT_GROUP(N_("Options related to merging")), OPT_GROUP(N_("Options related to merging")),
{ OPTION_CALLBACK, 'r', "rebase", &opt_rebase, { OPTION_CALLBACK, 'r', "rebase", &opt_rebase,
"false|true|preserve", "false|true|preserve|interactive",
N_("incorporate changes by rebasing rather than merging"), N_("incorporate changes by rebasing rather than merging"),
PARSE_OPT_OPTARG, parse_opt_rebase }, PARSE_OPT_OPTARG, parse_opt_rebase },
OPT_PASSTHRU('n', NULL, &opt_diffstat, NULL, OPT_PASSTHRU('n', NULL, &opt_diffstat, NULL,
@ -772,6 +775,8 @@ static int run_rebase(const unsigned char *curr_head,
/* Options passed to git-rebase */ /* Options passed to git-rebase */
if (opt_rebase == REBASE_PRESERVE) if (opt_rebase == REBASE_PRESERVE)
argv_array_push(&args, "--preserve-merges"); argv_array_push(&args, "--preserve-merges");
else if (opt_rebase == REBASE_INTERACTIVE)
argv_array_push(&args, "--interactive");
if (opt_diffstat) if (opt_diffstat)
argv_array_push(&args, opt_diffstat); argv_array_push(&args, opt_diffstat);
argv_array_pushv(&args, opt_strategies.argv); argv_array_pushv(&args, opt_strategies.argv);

View File

@ -326,6 +326,16 @@ test_expect_success 'pull.rebase=preserve rebases and merges keep-merge' '
test "$(git rev-parse HEAD^2)" = "$(git rev-parse keep-merge)" test "$(git rev-parse HEAD^2)" = "$(git rev-parse keep-merge)"
' '
test_expect_success 'pull.rebase=interactive' '
write_script "$TRASH_DIRECTORY/fake-editor" <<-\EOF &&
echo I was here >fake.out &&
false
EOF
test_set_editor "$TRASH_DIRECTORY/fake-editor" &&
test_must_fail git pull --rebase=interactive . copy &&
test "I was here" = "$(cat fake.out)"
'
test_expect_success 'pull.rebase=invalid fails' ' test_expect_success 'pull.rebase=invalid fails' '
git reset --hard before-preserve-rebase && git reset --hard before-preserve-rebase &&
test_config pull.rebase invalid && test_config pull.rebase invalid &&