This should be easier with Git 2.35 (Q1 2022): the default merge message prepared by "git merge
"(man) records the name of the current branch; the name can now be overridden with a new option to allow users to pretend a merge is made on a different branch.
See commit bd2bc94 (20 Dec 2021) by Junio C Hamano (gitster
).
(Merged by Junio C Hamano -- gitster
-- in commit bb14cfd, 05 Jan 2022)
merge
: allow to pretend a merge is made into a different branch
When a series of patches for a topic-B
depends on having topic-A
, the workflow to prepare the topic-B
branch would look like this:
$ git checkout -b topic-B main
$ git merge --no-ff --no-edit topic-A
$ git am <mbox-for-topic-B
When topic-A
gets updated, recreating the first merge and rebasing the rest of the topic-B
, all on detached HEAD, is a useful technique.
After updating topic-A
with its new round of patches:
(0) $ git checkout topic-B
(1) $ prev=$(git rev-parse 'HEAD^{/^Merge branch .topic-A. into}')
(2) $ git checkout --detach $prev^1
(3) $ git merge --no-ff --no-edit topic-A
(4) $ git rebase --onto HEAD $prev @{-1}^0
(5) $ git checkout -B @{-1}
This will:
- (0) check out the current
topic-B
.
- (1) find the previous merge of
topic-A
into topic-B
.
- (2) detach the HEAD to the parent of the previous merge.
- (3) merge the updated
topic-A
to it.
- (4) reapply the patches to rebuild the rest of
topic-B
.
- (5) update
topic-B
with the result.
without contaminating the reflog of topic-B
too much.
topic-B@{1}
is the "logically previous" state before topic-A
got updated, for example.
At (4), comparison (e.g. range-diff
) between HEAD
and @{-1}
is a meaningful way to sanity check the result, and the same can be done at (5) by comparing topic-B
and topic-B@{1}
.
But there is one glitch.
The merge into the detached HEAD done in the step (3) above gives us "Merge branch 'topic-A' into HEAD
", and does not say "into topic-B
".
Teach the "--into-name=<branch>
" option to "git merge
"(man) and its underlying git fmt-merge-message, to pretend as if we were merging into <branch>
, no matter what branch we are actually merging into, when they prepare the merge message.
git fmt-merge-msg
now includes in its man page:
'git fmt-merge-msg' [-m ] [--into-name ] [--log[=] | --no-log]
--into-name <branch>
Prepare the merge message as if merging to the branch <branch>
,
instead of the name of the real branch to which the merge is made.
git merge
now includes in its man page:
--into-name <branch>
Prepare the default merge message as if merging to the branch
<branch>
, instead of the name of the real branch to which
the merge is made.