From: George Spelvin <lkml@SDF.ORG>
To: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Cc: Junio C Hamano <gitster@pobox.com>, git@vger.kernel.org, lkml@sdf.org
Subject: Re: Feature request: rebase -i inside of rebase -i
Date: Sat, 21 Mar 2020 17:56:12 +0000 [thread overview]
Message-ID: <20200321175612.GC19579@SDF.ORG> (raw)
In-Reply-To: <nycvar.QRO.7.76.6.2003211135380.46@tvgsbejvaqbjf.bet>
On Sat, Mar 21, 2020 at 11:51:10AM +0100, Johannes Schindelin wrote:
> My biggest caveat is that I had to force-exit the rebase at some stage
> due to reasons I only vaguely remember. It had something to do with the
> replacement cache not being updated when an `exec` is executed that adds a
> replacement object via `git replace` [*1*]. This issue might have
> _nothing_ to do with nested rebases, but as I said, my recollection is
> vague.
This is the sort of internal implementation gotcha I worry about.
> There are a couple more concerns, of course, such as: what to do if the
> user deletes the entire todo list (which is traditionally the only way to
> abort a rebase)? My gut feeling is that it should go back to the
> _previous_ version of the todo list.
My assumption has been that, for simplicity, there would only be one
commit in progress, and aborting it aborts everything.
> Another big concern is what to do about `rebase.missingCommitsCheck`: with
> nested rebases, this will get increasingly tricky. Like, imagine you are
> rebasing 5 commits, the third of them results in merge conflicts, you
> realize that it is obsolete and so is now the first, already rebased
> commit. You do a nested rebase of the latest two commits to drop them, but
> they don't have their original commit hashes any longer. So it gets a bit
> finicky to keep track of what commit has been dropped on purpose and what
> was forgotten to pick instead.
This doesn't *seem* difficult, but I don't know how the current mechanism
works.
It just checks that all commits that were on the to-do list when the
editor started are still listed (possibly marked "drop") when it exits.
When you do a nested commit, additional commits are prepended to the to-do
list, you're dropped into the editor, and the same check is made when the
editor returns.
If rebase.missingCommitsCheck = error is triggered, you end up with the
<upstream> tree state with nothing applied and may either --continue to
ignore the error or --edit-todo to put back the missing commits.
Let me give an example. Suppose I have commits a-b-c-d-e, and start
with rebase -i b.
My to-do list starts out as c-d-e, but suppose I decide to cherry-pick
z and add it to the list, so it's now z-c-d-e.
So I start rebasing, and it turns out that d creates a merge conflict
because I forgot a prerequisite patch y. And I really want y and z before
b, anyway.
So the tree state is currently a-b-z'-c', with d in progress and e yet to
do. In my simple model, I have to resolve and commit d, so the tree
state is a-b-z'-c'-d'. Then I can rebase -i a, and am presented with
a to-do list of b-z'-c'-d'-e.
If I delete any of those five commits, then rebase.missingCommitsCheck
will trigger. If I put y in the list, save it, then change my mind and
--edit-todo and delete y, it will also trigger.
Now, it sould be nice if there were a way to say "screw this mess; just
check out HEAD and put d back on the to-do list", but that could
create a bit of a mess if I've split d and already committed half of
it. If I used that after doung that, I'd have a to-do list of
b-z'-c'-d'-d-e which might be awkward, but maybe it wouldn't be too bad.
next prev parent reply other threads:[~2020-03-21 17:56 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-03-20 22:30 Feature request: rebase -i inside of rebase -i George Spelvin
2020-03-20 22:51 ` Junio C Hamano
2020-03-20 23:35 ` George Spelvin
2020-03-21 10:51 ` Johannes Schindelin
2020-03-21 17:56 ` George Spelvin [this message]
2020-03-25 19:26 ` Johannes Schindelin
2020-03-26 0:18 ` George Spelvin
2020-03-28 14:25 ` Johannes Schindelin
2020-03-28 16:30 ` George Spelvin
2020-03-31 0:00 ` George Spelvin
2020-03-31 10:57 ` Philip Oakley
2020-03-31 13:36 ` Phillip Wood
2020-04-01 16:43 ` Philip Oakley
2020-04-07 15:54 ` Phillip Wood
2020-04-04 12:17 ` Johannes Schindelin
2020-04-04 12:39 ` Johannes Schindelin
2020-04-04 17:41 ` George Spelvin
2020-04-06 10:40 ` Sebastien Bruckert
2020-04-06 15:24 ` George Spelvin
2020-04-07 9:16 ` Sebastien Bruckert
2020-04-07 19:03 ` George Spelvin
2020-03-30 14:01 ` Philip Oakley
2020-03-30 18:18 ` George Spelvin
2020-03-30 21:53 ` Philip Oakley
2020-03-21 8:47 ` Johannes Sixt
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=20200321175612.GC19579@SDF.ORG \
--to=lkml@sdf.org \
--cc=Johannes.Schindelin@gmx.de \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.