[PATCH v6 12/15] rebase --rebase-merges: avoid "empty merges"
- From
Johannes Schindelin <johannes.schindelin@gmx.de>
- Date
- Apr 10, 2018, 12:30 UTC
- Message-ID
- <83ed7db2611c092eec775b05537eaa1826b2e664.1523362469.git.johannes.schindelin@gmx.de>
- In-Reply-To
- <cover.1523362469.git.johannes.schindelin@gmx.de>
The `git merge` command does not allow merging commits that are already reachable from HEAD: `git merge HEAD^`, for example, will report that we are already up to date and not change a thing.
In an interactive rebase, such a merge could occur previously, e.g. when competing (or slightly modified) versions of a patch series were applied upstream, and the user had to `git rebase --skip` all of the local commits, and the topic branch becomes "empty" as a consequence.
Let's teach the todo command `merge` to behave the same as `git merge`.
Seeing as it requires some low-level trickery to create such merges with Git's commands in the first place, we do not even have to bother to introduce an option to force `merge` to create such merge commits.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> --- sequencer.c | 8 ++++++++ t/t3430-rebase-merges.sh | 8 ++++++++ 2 files changed, 16 insertions(+)
diff --git a/sequencer.c b/sequencer.c index 878ff449fe8..60bad5708c6 100644 --- a/sequencer.c +++ b/sequencer.c @@ -2788,6 +2788,14 @@ static int do_merge(struct commit *commit, const char *arg, int arg_len, write_message("no-ff", 5, git_path_merge_mode(), 0); bases = get_merge_bases(head_commit, merge_commit); + if (bases && !oidcmp(&merge_commit->object.oid, + &bases->item->object.oid)) { + strbuf_release(&ref_name); + rollback_lock_file(&lock); + /* skip merging an ancestor of HEAD */ + return 0; + } + for (j = bases; j; j = j->next) commit_list_insert(j->item, &reversed); free_commit_list(bases); diff --git a/t/t3430-rebase-merges.sh b/t/t3430-rebase-merges.sh index 392c1136973..63faf7c2246 100755 --- a/t/t3430-rebase-merges.sh +++ b/t/t3430-rebase-merges.sh @@ -182,4 +182,12 @@ test_expect_success 'post-rewrite hook and fixups work for merges' ' test_cmp expect actual ' +test_expect_success 'refuse to merge ancestors of HEAD' ' + echo "merge HEAD^" >script-from-scratch && + test_config -C wt sequence.editor \""$PWD"/replace-editor.sh\" && + before="$(git rev-parse HEAD)" && + git rebase -i HEAD && + test_cmp_rev HEAD $before +' + test_done
-- 2.17.0.windows.1.4.g7e4058d72e3