rebase --rebase-merges: a "merge" into a new root is a fast-forward

When a user provides a todo list containing something like

	reset [new root]
	merge my-branch

let's do the same as if pulling into an orphan branch: simply
fast-forward.

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 2018-05-04 01:01:28 +02:00 коммит произвёл Junio C Hamano
Родитель ebddf39396
Коммит 9c85a1c29c
2 изменённых файлов: 25 добавлений и 0 удалений

Просмотреть файл

@ -2870,6 +2870,18 @@ static int do_merge(struct commit *commit, const char *arg, int arg_len,
goto leave_merge;
}
if (opts->have_squash_onto &&
!oidcmp(&head_commit->object.oid, &opts->squash_onto)) {
/*
* When the user tells us to "merge" something into a
* "[new root]", let's simply fast-forward to the merge head.
*/
rollback_lock_file(&lock);
ret = fast_forward_to(&merge_commit->object.oid,
&head_commit->object.oid, 0, opts);
goto leave_merge;
}
if (commit) {
const char *message = get_commit_buffer(commit, NULL);
const char *body;

Просмотреть файл

@ -275,4 +275,17 @@ test_expect_success 'root commits' '
test_cmp_rev HEAD $before
'
test_expect_success 'a "merge" into a root commit is a fast-forward' '
head=$(git rev-parse HEAD) &&
cat >script-from-scratch <<-EOF &&
reset [new root]
merge $head
EOF
test_config sequence.editor \""$PWD"/replace-editor.sh\" &&
test_tick &&
git rebase -i -r HEAD^ &&
test_cmp_rev HEAD $head
'
test_done