It's helpful in the case where a bit of code has been detached from its history by way of copying the files and starting a new repo, where development continues. If you want to reunite the new history with the prior history, while preferring the new history, you need to `rebase -Xtheirs` the new branch onto the old. Best, Ben On Wed, Apr 20, 2016 at 2:13 PM, Junio C Hamano <gitster@xxxxxxxxx> wrote: > Ben Woosley <Ben.Woosley@xxxxxxxxx> writes: > >> From: Ben Woosley <ben.woosley@xxxxxxxxx> >> >> 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@xxxxxxxxx> >> --- >> 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. > >> 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 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html