* Leveraging --rebase-merges --update-refs mechanism to rebase several branches in one run
[not found] <763603689.1820092086.1704566524953.JavaMail.root@zimbra39-e7>
@ 2024-01-06 19:05 ` Yann Dirson
2024-01-07 8:57 ` Johannes Sixt
0 siblings, 1 reply; 4+ messages in thread
From: Yann Dirson @ 2024-01-06 19:05 UTC (permalink / raw)
To: git
This idea comes from a repo[1] where I am experimenting with code variants:
on one side I have a branch where I add to the core mechanisms, and on the
other(s) I have several branches where I experiment with different rendering
options.
There are indeed 2 different workflows here:
- improving the variants themselves, where occasionally some fixup or new
commit for the core branch gets introduced
- adding feature to the core branch, then merging that into each variant,
where fixups already appear quite regularly
That produces a set closely-related branches with lots of merges, and applying
the fixups is a bit tricky.
The "core + 1 variant" case pretty much works out of the box, with --rebase-merges
and --update-refs generating a perfect instructions sheet.
But if I was to rebase just one variant while rewriting the core branch, obviously
all other variants would still fork off the pre-rewrite core branch, and we'd loose
all chances of automating the same work on the other variants.
OTOH, if I get `git-rebase` to generate the instruction sheets for those other
variants first, strip them (manually) from the common part, and insert them in the
instruction sheet of my "core + 1 variant" case ... I do get the whole of my branches
rebased together, and sharing the updated core.
So the question is, would there be any obstacles to let git-rebase automate this
completely? By chance it could even be a trivial change?
I guess we'd only want this feature to be enabled under certain conditions, like
--update-refs being specified so the many heads of the rebase would be reachable.
[1] https://github.com/ydirson/test-yew-tutorial/tree/opr is the "core" branch,
and branches opr-* are the variants
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Leveraging --rebase-merges --update-refs mechanism to rebase several branches in one run
2024-01-06 19:05 ` Leveraging --rebase-merges --update-refs mechanism to rebase several branches in one run Yann Dirson
@ 2024-01-07 8:57 ` Johannes Sixt
2024-01-07 11:37 ` Yann Dirson
0 siblings, 1 reply; 4+ messages in thread
From: Johannes Sixt @ 2024-01-07 8:57 UTC (permalink / raw)
To: Yann Dirson; +Cc: git
Am 06.01.24 um 20:05 schrieb Yann Dirson:
> The "core + 1 variant" case pretty much works out of the box, with --rebase-merges
> and --update-refs generating a perfect instructions sheet.
>
> But if I was to rebase just one variant while rewriting the core branch, obviously
> all other variants would still fork off the pre-rewrite core branch, and we'd loose
> all chances of automating the same work on the other variants.
>
> OTOH, if I get `git-rebase` to generate the instruction sheets for those other
> variants first, strip them (manually) from the common part, and insert them in the
> instruction sheet of my "core + 1 variant" case ... I do get the whole of my branches
> rebased together, and sharing the updated core.
Not a complete automation, but... You can merge all variant branches
into a temporary branch (or detached HEAD), even if that are merely -s
ours merges, and then rebase the temporary branch with --rebase-merges
--update-refs. This will generate the instruction sheet that you want.
You can remove the final merge instructions (the temporary ones) from
the instruction sheet if you do not want them to be executed.
-- Hannes
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Leveraging --rebase-merges --update-refs mechanism to rebase several branches in one run
2024-01-07 8:57 ` Johannes Sixt
@ 2024-01-07 11:37 ` Yann Dirson
2024-01-07 15:31 ` Interactive rebase doc (Was: Leveraging --rebase-merges --update-refs mechanism to rebase several branches in one run) Yann Dirson
0 siblings, 1 reply; 4+ messages in thread
From: Yann Dirson @ 2024-01-07 11:37 UTC (permalink / raw)
To: Johannes Sixt; +Cc: git
Johannes Sixt wrote:
> Am 06.01.24 um 20:05 schrieb Yann Dirson:
> > The "core + 1 variant" case pretty much works out of the box, with
> > --rebase-merges
> > and --update-refs generating a perfect instructions sheet.
> >
> > But if I was to rebase just one variant while rewriting the core
> > branch, obviously
> > all other variants would still fork off the pre-rewrite core
> > branch, and we'd loose
> > all chances of automating the same work on the other variants.
> >
> > OTOH, if I get `git-rebase` to generate the instruction sheets for
> > those other
> > variants first, strip them (manually) from the common part, and
> > insert them in the
> > instruction sheet of my "core + 1 variant" case ... I do get the
> > whole of my branches
> > rebased together, and sharing the updated core.
>
> Not a complete automation, but... You can merge all variant branches
> into a temporary branch (or detached HEAD), even if that are merely
> -s
> ours merges, and then rebase the temporary branch with
> --rebase-merges
> --update-refs. This will generate the instruction sheet that you
> want.
> You can remove the final merge instructions (the temporary ones) from
> the instruction sheet if you do not want them to be executed.
Nice idea, and this is indeed automatable for the most part, Q&D PoC below.
There are a few things I can see missing in this PoC:
- removal of the final merge from instruction sheet
Could be done by wrapping $EDITOR - I'm not particularly fond doing things
behind the user's back, but I lack better ideas.
- restoration of HEAD
In the general case it cannot be done from the script, so we would naturally
want to do that from the instruction sheet?
While I was at manually removing the final merge, I experimented with changing
the "reset onto" to "reset <a branch name>", but that resulted in moving HEAD
to the pre-rebase version of the requested branch.
- When aborting the rebase HEAD still points to the extra merge
This is indeed a special case of the above, where instruction sheet cannot
be used, and where the script could help since we won't be in the middle of
a rebase when git-rebase stops.
There does not seem to be any documented exit-code protocol to tell the
git-rebase caller the user aborted. I guess "HEAD pointing to this commit"
could be used to identify the abort.
---- 8< ---- git-rebase-batch
#!/bin/bash
set -e
die() {
echo >&2 "ERROR: $0: $*"
exit 1
}
REBASE_OPTS=(--interactive --rebase-merges --update-refs)
# all args before "--" are passed to git-rebase
while [ $# -ge 1 ]; do
case "$1" in
--) shift; break;;
*) REBASE_OPTS+=("$1"); shift;;
esac
done
[ $# -ge 3 ] || die "need cutting-point and at least 2 refs to rebase"
CUT="$1"
shift
git checkout --detach "$CUT"
git merge -s ours "$@" -m "temporary handle for all rebased branches"
git rebase "${REBASE_OPTS[@]}" "$CUT" HEAD
# here we can be in the middle of interactive rebase, cannot perform
# any kind of cleanup (which would include restoring HEAD ref to its
# original destination)
---- 8< ----
^ permalink raw reply [flat|nested] 4+ messages in thread
* Interactive rebase doc (Was: Leveraging --rebase-merges --update-refs mechanism to rebase several branches in one run)
2024-01-07 11:37 ` Yann Dirson
@ 2024-01-07 15:31 ` Yann Dirson
0 siblings, 0 replies; 4+ messages in thread
From: Yann Dirson @ 2024-01-07 15:31 UTC (permalink / raw)
To: git; +Cc: Johannes Sixt
> Johannes Sixt wrote:
> > Am 06.01.24 um 20:05 schrieb Yann Dirson:
> > > The "core + 1 variant" case pretty much works out of the box,
> > > with
> > > --rebase-merges
> > > and --update-refs generating a perfect instructions sheet.
> > >
> > > But if I was to rebase just one variant while rewriting the core
> > > branch, obviously
> > > all other variants would still fork off the pre-rewrite core
> > > branch, and we'd loose
> > > all chances of automating the same work on the other variants.
> > >
> > > OTOH, if I get `git-rebase` to generate the instruction sheets
> > > for
> > > those other
> > > variants first, strip them (manually) from the common part, and
> > > insert them in the
> > > instruction sheet of my "core + 1 variant" case ... I do get the
> > > whole of my branches
> > > rebased together, and sharing the updated core.
> >
> > Not a complete automation, but... You can merge all variant
> > branches
> > into a temporary branch (or detached HEAD), even if that are merely
> > -s
> > ours merges, and then rebase the temporary branch with
> > --rebase-merges
> > --update-refs. This will generate the instruction sheet that you
> > want.
> > You can remove the final merge instructions (the temporary ones)
> > from
> > the instruction sheet if you do not want them to be executed.
>
> Nice idea, and this is indeed automatable for the most part, Q&D PoC
> below.
>
> There are a few things I can see missing in this PoC:
>
> - removal of the final merge from instruction sheet
>
> Could be done by wrapping $EDITOR - I'm not particularly fond doing
> things
> behind the user's back, but I lack better ideas.
>
> - restoration of HEAD
>
> In the general case it cannot be done from the script, so we would
> naturally
> want to do that from the instruction sheet?
>
> While I was at manually removing the final merge, I experimented
> with changing
> the "reset onto" to "reset <a branch name>", but that resulted in
> moving HEAD
> to the pre-rebase version of the requested branch.
Related to this, I turned to the rebase manpage to get reference
information about update-ref, but I could not find anything about it:
only --update-refs is described, but this description also only seems to
address the non-interactive behavior.
In fact:
- there does not appear to be a reference to the interactive
instruction sheet in the rebase doc, only in the default template
- --interactive only directs the user to "Splitting commits", not to
"interactive mode"
- the "interactive mode" section really looks more like a didactic intro
to interactive rebase than like a reference doc
Would it seem OK to change things as follows?
- move current "interactive mode", "splitting commits", and "rebasing merges"
contents into a new gitrebase(7) guide
- leave in git-rebase(1) only an "interactive mode" with the reference doc
for the instruction sheet, and a pointer to the guide for detailed walkthrough
- selectively move back a few things like --strategy paragraph from
"rebasing merges"
Best regards,
--
Yann
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2024-01-07 15:31 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <763603689.1820092086.1704566524953.JavaMail.root@zimbra39-e7>
2024-01-06 19:05 ` Leveraging --rebase-merges --update-refs mechanism to rebase several branches in one run Yann Dirson
2024-01-07 8:57 ` Johannes Sixt
2024-01-07 11:37 ` Yann Dirson
2024-01-07 15:31 ` Interactive rebase doc (Was: Leveraging --rebase-merges --update-refs mechanism to rebase several branches in one run) Yann Dirson
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).