Merge branch 'js/rebase-r-and-merge-head'
Bugfix for the recently graduated "git rebase --rebase-merges". * js/rebase-r-and-merge-head: status: rebase and merge can be in progress at the same time built-in rebase --skip/--abort: clean up stale .git/<name> files rebase -i: include MERGE_HEAD into files to clean up rebase -r: do not write MERGE_HEAD unless needed rebase -r: demonstrate bug with conflicting merges
This commit is contained in:
commit
0de3a73eb6
@ -23,6 +23,7 @@
|
|||||||
#include "revision.h"
|
#include "revision.h"
|
||||||
#include "commit-reach.h"
|
#include "commit-reach.h"
|
||||||
#include "rerere.h"
|
#include "rerere.h"
|
||||||
|
#include "branch.h"
|
||||||
|
|
||||||
static char const * const builtin_rebase_usage[] = {
|
static char const * const builtin_rebase_usage[] = {
|
||||||
N_("git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] "
|
N_("git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] "
|
||||||
@ -1021,6 +1022,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
|
|||||||
if (reset_head(NULL, "reset", NULL, RESET_HEAD_HARD,
|
if (reset_head(NULL, "reset", NULL, RESET_HEAD_HARD,
|
||||||
NULL, NULL) < 0)
|
NULL, NULL) < 0)
|
||||||
die(_("could not discard worktree changes"));
|
die(_("could not discard worktree changes"));
|
||||||
|
remove_branch_state();
|
||||||
if (read_basic_state(&options))
|
if (read_basic_state(&options))
|
||||||
exit(1);
|
exit(1);
|
||||||
goto run_rebase;
|
goto run_rebase;
|
||||||
@ -1039,6 +1041,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
|
|||||||
NULL, NULL) < 0)
|
NULL, NULL) < 0)
|
||||||
die(_("could not move back to %s"),
|
die(_("could not move back to %s"),
|
||||||
oid_to_hex(&options.orig_head));
|
oid_to_hex(&options.orig_head));
|
||||||
|
remove_branch_state();
|
||||||
ret = finish_rebase(&options);
|
ret = finish_rebase(&options);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
10
sequencer.c
10
sequencer.c
@ -3244,10 +3244,6 @@ static int do_merge(struct commit *commit, const char *arg, int arg_len,
|
|||||||
}
|
}
|
||||||
|
|
||||||
merge_commit = to_merge->item;
|
merge_commit = to_merge->item;
|
||||||
write_message(oid_to_hex(&merge_commit->object.oid), GIT_SHA1_HEXSZ,
|
|
||||||
git_path_merge_head(the_repository), 0);
|
|
||||||
write_message("no-ff", 5, git_path_merge_mode(the_repository), 0);
|
|
||||||
|
|
||||||
bases = get_merge_bases(head_commit, merge_commit);
|
bases = get_merge_bases(head_commit, merge_commit);
|
||||||
if (bases && oideq(&merge_commit->object.oid,
|
if (bases && oideq(&merge_commit->object.oid,
|
||||||
&bases->item->object.oid)) {
|
&bases->item->object.oid)) {
|
||||||
@ -3256,6 +3252,10 @@ static int do_merge(struct commit *commit, const char *arg, int arg_len,
|
|||||||
goto leave_merge;
|
goto leave_merge;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
write_message(oid_to_hex(&merge_commit->object.oid), GIT_SHA1_HEXSZ,
|
||||||
|
git_path_merge_head(the_repository), 0);
|
||||||
|
write_message("no-ff", 5, git_path_merge_mode(the_repository), 0);
|
||||||
|
|
||||||
for (j = bases; j; j = j->next)
|
for (j = bases; j; j = j->next)
|
||||||
commit_list_insert(j->item, &reversed);
|
commit_list_insert(j->item, &reversed);
|
||||||
free_commit_list(bases);
|
free_commit_list(bases);
|
||||||
@ -3512,6 +3512,7 @@ static int pick_commits(struct todo_list *todo_list, struct replay_opts *opts)
|
|||||||
unlink(rebase_path_author_script());
|
unlink(rebase_path_author_script());
|
||||||
unlink(rebase_path_stopped_sha());
|
unlink(rebase_path_stopped_sha());
|
||||||
unlink(rebase_path_amend());
|
unlink(rebase_path_amend());
|
||||||
|
unlink(git_path_merge_head(the_repository));
|
||||||
delete_ref(NULL, "REBASE_HEAD", NULL, REF_NO_DEREF);
|
delete_ref(NULL, "REBASE_HEAD", NULL, REF_NO_DEREF);
|
||||||
|
|
||||||
if (item->command == TODO_BREAK)
|
if (item->command == TODO_BREAK)
|
||||||
@ -3882,6 +3883,7 @@ static int commit_staged_changes(struct replay_opts *opts,
|
|||||||
opts, flags))
|
opts, flags))
|
||||||
return error(_("could not commit staged changes."));
|
return error(_("could not commit staged changes."));
|
||||||
unlink(rebase_path_amend());
|
unlink(rebase_path_amend());
|
||||||
|
unlink(git_path_merge_head(the_repository));
|
||||||
if (final_fixup) {
|
if (final_fixup) {
|
||||||
unlink(rebase_path_fixup_msg());
|
unlink(rebase_path_fixup_msg());
|
||||||
unlink(rebase_path_squash_msg());
|
unlink(rebase_path_squash_msg());
|
||||||
|
@ -396,4 +396,20 @@ test_expect_success 'with --autosquash and --exec' '
|
|||||||
grep "G: +G" actual
|
grep "G: +G" actual
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success '--continue after resolving conflicts after a merge' '
|
||||||
|
git checkout -b already-has-g E &&
|
||||||
|
git cherry-pick E..G &&
|
||||||
|
test_commit H2 &&
|
||||||
|
|
||||||
|
git checkout -b conflicts-in-merge H &&
|
||||||
|
test_commit H2 H2.t conflicts H2-conflict &&
|
||||||
|
test_must_fail git rebase -r already-has-g &&
|
||||||
|
grep conflicts H2.t &&
|
||||||
|
echo resolved >H2.t &&
|
||||||
|
git add -u &&
|
||||||
|
git rebase --continue &&
|
||||||
|
test_must_fail git rev-parse --verify HEAD^2 &&
|
||||||
|
test_path_is_missing .git/MERGE_HEAD
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
@ -1559,6 +1559,7 @@ void wt_status_get_state(struct wt_status_state *state,
|
|||||||
struct object_id oid;
|
struct object_id oid;
|
||||||
|
|
||||||
if (!stat(git_path_merge_head(the_repository), &st)) {
|
if (!stat(git_path_merge_head(the_repository), &st)) {
|
||||||
|
wt_status_check_rebase(NULL, state);
|
||||||
state->merge_in_progress = 1;
|
state->merge_in_progress = 1;
|
||||||
} else if (wt_status_check_rebase(NULL, state)) {
|
} else if (wt_status_check_rebase(NULL, state)) {
|
||||||
; /* all set */
|
; /* all set */
|
||||||
@ -1583,9 +1584,13 @@ static void wt_longstatus_print_state(struct wt_status *s)
|
|||||||
const char *state_color = color(WT_STATUS_HEADER, s);
|
const char *state_color = color(WT_STATUS_HEADER, s);
|
||||||
struct wt_status_state *state = &s->state;
|
struct wt_status_state *state = &s->state;
|
||||||
|
|
||||||
if (state->merge_in_progress)
|
if (state->merge_in_progress) {
|
||||||
|
if (state->rebase_interactive_in_progress) {
|
||||||
|
show_rebase_information(s, state_color);
|
||||||
|
fputs("\n", s->fp);
|
||||||
|
}
|
||||||
show_merge_in_progress(s, state_color);
|
show_merge_in_progress(s, state_color);
|
||||||
else if (state->am_in_progress)
|
} else if (state->am_in_progress)
|
||||||
show_am_in_progress(s, state_color);
|
show_am_in_progress(s, state_color);
|
||||||
else if (state->rebase_in_progress || state->rebase_interactive_in_progress)
|
else if (state->rebase_in_progress || state->rebase_interactive_in_progress)
|
||||||
show_rebase_in_progress(s, state_color);
|
show_rebase_in_progress(s, state_color);
|
||||||
|
Loading…
Reference in New Issue
Block a user