git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: git-merge: --no-commit is not respected on a fresh repository

From
Junio C Hamano <gitster@pobox.com>
Date
Apr 3, 2024, 17:29 UTC
Message-ID
<xmqqv84y73th.fsf@gitster.g>
In-Reply-To
<22efe19e-de44-4b6d-8e8b-57e2bddb321e@anexia.com>
Jasmin Oster <JOster@anexia.com> writes:
> 1. Create a new repository: $ git init
> 2. Add a remote: $ git remote add foo ../<path-to-another-repo>
> 3. Fetch everything: $ git fetch --all
> 4. Initiate a subtree merge: $ git merge -s our --no-commit foo/main

This is expected. We are not creating any new commit, so it is following the --no-commit option to the letter. Obviously it is different from what you expected to see, though ;-)

The "merge into void" first came to "git pull $URL $branch" (no other options) where people tried to pull into a freshly created repository, where it was very clear that they wanted to have a copy of the upstream branch. The "git pull" implementation of the "pulling into void" feature forgot that curious users may give "--no-commit", and just always fast-forwarded to the merged commit without checking if such an option was given.

The behaviour you are seeing was inherited into "git merge". It also always fast-forwards to the merged commit, ignoring the option.

In either case, there is no new commit created. The history you are seeing is the exact history of the upstream. If you want to dissociate your history from theirs and start your history anew:

    $ git merge foo/main
    $ git checkout --orphan master

would give you an unborn branch "master", with the merge result in the working tree and in the index, without any history behind it. If you wanted to, you can then rename it to main from this state with:

    $ git branch -M master main

We could make it more explicit with a patch like the following, but it probably is not worth it. I dunno.

 builtin/merge.c | 2 ++
 builtin/pull.c  | 2 ++
 2 files changed, 4 insertions(+)
diff --git c/builtin/merge.c w/builtin/merge.c
index 1cbd6a899c..1c3165e99a 100644
--- c/builtin/merge.c
+++ w/builtin/merge.c
@@ -1434,6 +1434,8 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
 		struct object_id *remote_head_oid;
 		if (squash)
 			die(_("Squash commit into empty head not supported yet"));
+		if (!option_commit)
+			die(_("--no-commit into empty head not supported"));
 		if (fast_forward == FF_NO)
 			die(_("Non-fast-forward commit does not make sense into "
 			    "an empty head"));
diff --git c/builtin/pull.c w/builtin/pull.c
index 72cbb76d52..98c11ecc55 100644
--- c/builtin/pull.c
+++ w/builtin/pull.c
@@ -1097,6 +1097,8 @@ int cmd_pull(int argc, const char **argv, const char *prefix)
 	if (is_null_oid(&orig_head)) {
 		if (merge_heads.nr > 1)
 			die(_("Cannot merge multiple branches into empty head."));
+		if (opt_commit && !strcmp("--no-commit", opt_commit))
+			die(_("--no-commit into empty head not supported"));
 		ret = pull_into_void(merge_heads.oid, &curr_head);
 		goto cleanup;
 	}
Previous: Jasmin Oster
Message 2 of 2 in “git-merge: --no-commit is not respected on a fresh repository”
  1. Jasmin OsterApr 3, 2024
  2. Junio C HamanoApr 3, 2024

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.