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 <>
 sequencer.c              | 8 ++++++++
 t/ | 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);
diff --git a/t/ b/t/
index 392c1136973..63faf7c2246 100755
--- a/t/
+++ b/t/
@@ -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"/\" &&
+       before="$(git rev-parse HEAD)" &&
+       git rebase -i HEAD &&
+       test_cmp_rev HEAD $before

Reply via email to