mirror of
https://github.com/git/git.git
synced 2024-11-24 10:26:17 +08:00
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:
commit
35898eafab
@ -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 {
|
||||
|
@ -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 &&
|
||||
|
Loading…
Reference in New Issue
Block a user