Merge branch 'tb/pull-ff-rebase-autostash'

"git pull --rebase --autostash" didn't auto-stash when the local history
fast-forwards to the upstream.

* tb/pull-ff-rebase-autostash:
  pull: ff --rebase --autostash works in dirty repo
This commit is contained in:
Junio C Hamano 2017-06-05 09:18:13 +09:00
commit 35898eafab
2 changed files with 31 additions and 10 deletions

View File

@ -772,6 +772,7 @@ int cmd_pull(int argc, const char **argv, const char *prefix)
struct oid_array merge_heads = OID_ARRAY_INIT;
struct object_id orig_head, curr_head;
struct object_id rebase_fork_point;
int autostash;
if (!getenv("GIT_REFLOG_ACTION"))
set_reflog_message(argc, argv);
@ -800,8 +801,8 @@ int cmd_pull(int argc, const char **argv, const char *prefix)
if (!opt_rebase && opt_autostash != -1)
die(_("--[no-]autostash option is only valid with --rebase."));
autostash = config_autostash;
if (opt_rebase) {
int autostash = config_autostash;
if (opt_autostash != -1)
autostash = opt_autostash;
@ -862,16 +863,18 @@ int cmd_pull(int argc, const char **argv, const char *prefix)
die(_("Cannot rebase onto multiple branches."));
if (opt_rebase) {
struct commit_list *list = NULL;
struct commit *merge_head, *head;
if (!autostash) {
struct commit_list *list = NULL;
struct commit *merge_head, *head;
head = lookup_commit_reference(&orig_head);
commit_list_insert(head, &list);
merge_head = lookup_commit_reference(&merge_heads.oid[0]);
if (is_descendant_of(merge_head, list)) {
/* we can fast-forward this without invoking rebase */
opt_ff = "--ff-only";
return run_merge();
head = lookup_commit_reference(&orig_head);
commit_list_insert(head, &list);
merge_head = lookup_commit_reference(&merge_heads.oid[0]);
if (is_descendant_of(merge_head, list)) {
/* we can fast-forward this without invoking rebase */
opt_ff = "--ff-only";
return run_merge();
}
}
return run_rebase(&curr_head, merge_heads.oid, &rebase_fork_point);
} else {

View File

@ -272,6 +272,24 @@ test_expect_success '--rebase fast forward' '
test_cmp reflog.expected reflog.fuzzy
'
test_expect_success '--rebase --autostash fast forward' '
test_when_finished "
git reset --hard
git checkout to-rebase
git branch -D to-rebase-ff
git branch -D behind" &&
git branch behind &&
git checkout -b to-rebase-ff &&
echo another modification >>file &&
git add file &&
git commit -m mod &&
git checkout behind &&
echo dirty >file &&
git pull --rebase --autostash . to-rebase-ff &&
test "$(git rev-parse HEAD)" = "$(git rev-parse to-rebase-ff)"
'
test_expect_success '--rebase with conflicts shows advice' '
test_when_finished "git rebase --abort; git checkout -f to-rebase" &&
git checkout -b seq &&