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

Re: [PATCH] git-rebase--merge: don't include absent parent as a base

From
Junio C Hamano <gitster@pobox.com>
Date
Apr 20, 2016, 21:13 UTC
Message-ID
<xmqq1t60ugoi.fsf@gitster.mtv.corp.google.com>
In-Reply-To
<0102015434e7556a-2d9848cb-93c3-4883-96ec-c0c70098796b-000000@eu-west-1.amazonses.com>
Ben Woosley <Ben.Woosley@gmail.com> writes:
Show 38 quoted lines
> From: Ben Woosley <ben.woosley@gmail.com>
>
> Absent this fix, attempts to rebase an orphan branch with --strategy recursive
> will fail with:
>
>     $ git rebase ORPHAN_TARGET_BASE -s recursive
>     First, rewinding head to replay your work on top of it...
>     fatal: Could not parse object 'ORPHAN_ROOT_SHA^'
>     Unknown exit code (128) from command: git-merge-recursive ORPHAN_ROOT_SHA^ -- HEAD ORPHAN_ROOT_SHA
>
> To fix, this will only include the rebase root's parent as a base if it exists,
> so that in cases of rebasing an orphan branch, it is a simple two-way merge.
>
> Note the default rebase behavior does not fail:
>
>     $ git rebase ORPHAN_TARGET_BASE
>     First, rewinding head to replay your work on top of it...
>     Applying: ORPHAN_ROOT_COMMIT_MSG
>     Using index info to reconstruct a base tree...
>
> Signed-off-by: Ben Woosley <ben.woosley@gmail.com>
> ---
>  git-rebase--merge.sh    | 4 +++-
>  t/t3402-rebase-merge.sh | 9 +++++++++
>  2 files changed, 12 insertions(+), 1 deletion(-)
>
> diff --git a/git-rebase--merge.sh b/git-rebase--merge.sh
> index 2cc2a6d..8d43db9 100644
> --- a/git-rebase--merge.sh
> +++ b/git-rebase--merge.sh
> @@ -67,7 +67,9 @@ call_merge () {
>  		GIT_MERGE_VERBOSITY=1 && export GIT_MERGE_VERBOSITY
>  	fi
>  	test -z "$strategy" && strategy=recursive
> -	eval 'git-merge-$strategy' $strategy_opts '"$cmt^" -- "$hd" "$cmt"'
> +	# If cmt doesn't have a parent, don't include it as a base
> +	base=$(git rev-parse --verify --quiet $cmt^)
> +	eval 'git-merge-$strategy' $strategy_opts $base ' -- "$hd" "$cmt"'

Makes sense to me. It is not clear if such a merge without common ancestor is all that useful, but as it is mechanically possible, I do not see a reason to forbid it.

Show 26 quoted lines
>  	rv=$?
>  	case "$rv" in
>  	0)
> diff --git a/t/t3402-rebase-merge.sh b/t/t3402-rebase-merge.sh
> index 8f64505..488945e 100755
> --- a/t/t3402-rebase-merge.sh
> +++ b/t/t3402-rebase-merge.sh
> @@ -85,6 +85,15 @@ test_expect_success 'rebase -Xtheirs' '
>  	! grep 11 original
>  '
>  
> +test_expect_success 'rebase -Xtheirs from orphan' '
> +	git checkout --orphan orphan-conflicting master~2 &&
> +	echo "AB $T" >> original &&
> +	git commit -morphan-conflicting original &&
> +	git rebase -Xtheirs master &&
> +	grep AB original &&
> +	! grep 11 original
> +'
> +
>  test_expect_success 'merge and rebase should match' '
>  	git diff-tree -r test-rebase test-merge >difference &&
>  	if test -s difference
>
> --
> https://github.com/git/git/pull/228
Previous: Ben WoosleyNext: Ben Woosley
Message 2 of 3 in “git-rebase--merge: don't include absent parent as a base”
  1. git-rebase--merge: don't include absent parent as a baseBen Woosley, Apr 20, 2016
  2. Junio C HamanoApr 20, 2016
  3. Ben WoosleyApr 20, 2016

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.