From: Nico Williams <nico@cryptonector.com>
To: Alejandro Colomar <alx@kernel.org>
Cc: git@vger.kernel.org
Subject: Re: git-rebase-walk
Date: Thu, 1 Oct 2026 11:10:59 -0500 [thread overview]
Message-ID: <ar6GExDLasWWFajm@ubby> (raw)
In-Reply-To: <ar5KL4_IKXYbx3Sb@debian>
On Thu, Oct 01, 2026 at 01:58:42PM +0200, Alejandro Colomar wrote:
> I use this little command to apply iterative rebases, which are easier
> to handle when there are large conflicts. Are you interested in it?
>
> $ cat $(which git-rebase-walk)
> #!/bin/bash
>
> set -Eeufo pipefail;
>
> git merge-base HEAD "$1" \
> | xargs -I{} git log --oneline {}.."$1" \
> | cut -f1 -d' ' \
> | tac \
> | while read -r c; do
> git rebase "$c";
> done;
You could simplify this pipeline to:
git log --reverse --format=%H $(git merge-base HEAD "$1").."$1" |
while read c; do git rebase "$c"; done
But:
- you need to add conflict handling
- this is very slow
I've tried this before, so I know it's very slow if you're rebasing
across thousands of upstream commits!
Also, you need some extra handling of conflicts.
> The source code is trivial, so I guess I don't need to explain much.
> It behaves quite nicely, IME.
It can be much too slow. I've a better solution: bisect-rebase.sh:
https://gist.github.com/nicowilliams/ea2fa2b445c2db50d2ee6509c3526297
(The first revision of that gist is slow-rebase.sh, which is a linear
rebase like the one you posted.)
This script very efficiently finds the firts upstream commit that your
branch conflicts with, asks the user to resolve conflicts, then resumes
rebasing.
So let's say that your upstream has 1,000 commits you need to rebase
across, and 10 of those introduce conflicts (assume there's no reverts
of those for now), then this script will ask you to resolve conflicts 10
times, and each time it's clear which pair of local and upstream commits
conflict so you have the best possible context for conflict resolution.
It's like git-imerge, but better in that it's specifically geared to
rebase workflows.
I've successfully used this bisect-rebase.sh script to rebase a
postgresql fork across between 1,000 and 2,000 commits twice, each time
with significant conflicts to resolve that were much too difficult to
resolve with a plain rebase. I.e., a plain `git rebase origin/master`
produced large conflicts where I didn't have enough context, but
bisect-rebase.sh let me resolve much smaller conflicts with a new base
that immediately introduced those conflicts, so I always had the right
context for resolving them.
PG is a perfect test case for this sort of thing because it's so large
and moves so fast.
Nico
--
next prev parent reply other threads:[~2026-10-01 16:35 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-01 11:58 git-rebase-walk Alejandro Colomar
2026-10-01 13:22 ` git-rebase-walk Patrick Steinhardt
2026-10-01 15:51 ` git-rebase-walk Alejandro Colomar
2026-10-02 6:46 ` git-rebase-walk Patrick Steinhardt
2026-10-02 7:19 ` git-rebase-walk Alejandro Colomar
2026-10-03 19:37 ` git-rebase-walk Nico Williams
2026-10-04 10:03 ` git-rebase-walk Phillip Wood
2026-10-05 13:28 ` git-rebase-walk Alejandro Colomar
2026-10-05 13:37 ` git-rebase-walk Alejandro Colomar
2026-10-06 14:01 ` git-rebase-walk Phillip Wood
2026-10-06 14:58 ` git-rebase-walk Nico Williams
2026-10-06 16:45 ` git-rebase-walk Alejandro Colomar
2026-10-08 22:05 ` git-rebase-walk Alejandro Colomar
2026-10-08 22:07 ` git-rebase-walk Alejandro Colomar
2026-10-01 17:31 ` git-rebase-walk Junio C Hamano
2026-10-01 16:10 ` Nico Williams [this message]
2026-10-01 16:50 ` git-rebase-walk Alejandro Colomar
2026-10-01 17:40 ` git-rebase-walk Nico Williams
2026-10-01 20:29 ` git-rebase-walk Alejandro Colomar
2026-10-01 21:01 ` git-rebase-walk Nico Williams
2026-10-01 21:35 ` git-rebase-walk Nico Williams
2026-10-02 2:49 ` git-rebase-walk Simon Richter
2026-10-02 3:19 ` git-rebase-walk Nico Williams
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ar6GExDLasWWFajm@ubby \
--to=nico@cryptonector.com \
--cc=alx@kernel.org \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox