git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: git rebase/git rebase --abort cause inconsistent state

From
EKEugen Konkov <kes-kes@yandex.ru>
Date
Nov 10, 2020, 17:59 UTC
Message-ID
<1564505431.20201110195952@yandex.ru>
In-Reply-To
<xmqqft5icsd9.fsf@gitster.c.googlers.com>
Hello Junio,
Monday, November 9, 2020, 8:11:46 PM, you wrote:
> Eugen Konkov <kes-kes@yandex.ru> writes:
Show 14 quoted lines
>>> You start at branch dev. Then you use the two argument form
>>
>>>      git rebase dev local/dev
>>
>>> and when you later
>>
>>>      git rebase --abort
>>
>>> then you are not warped back to dev, but to local/dev:
>>
>> I suppose `git rebase --abort` should return me back to `dev`, because
>> this is the state I was before the command. hmm... suppose it will not
>> return to original branch when [branch] parameter is specified for git
>> rebase
> Yes, "git rebase [--onto C] A B" has always been a short-hand for
>         git checkout B
>         git rebase [--onto C] A
> which means that if the second rebase step aborts, rebase wants to
> go back to the state before the rebase started, i.e. immediately
> after "checkout B" was done.
Show 9 quoted lines
> I think the root cause of the problem is that addition of the
> "--autostash" feature (which came much later than the two-arg form)
> was designed poorly.  If it wanted to keep the "two-arg form is a
> mere short-hand for checkout followed by rebase" semantics to avoid
> confusing existing users (which is probably a good thing and that
> seems to be what the code does), then the auto-stash should have
> been added _after_ we switch to the branch we rebase, i.e. B.  That
> way, the stash would be applicable if the rebase gets aborted and
> goes back to the original B, where the stash was taken from.
Show 9 quoted lines
> Of course, that would also mean that the original modification in
> the working tree and the index may not allow you to move to branch B
> (i.e. starting from your original branch O, and editing files in the
> working tree, "git checkout B" may notice that you edited files that
> are different between O and B and refuse to check out branch B to
> prevent you from losing your local modifications), but that probably
> is a good thing, if "two-arg form is a mere short-hand" paradigm is
> to be kept.  So, "use autostash and you can always rebase in a clean
> state" would no longer hold.
Show 6 quoted lines
> Another thing we could have done when adding "--autostash", was to
> redefine the meaning of the two-arg form.  Then it starts to make
> sense to take a stash _before_ switching to the branch to be rebased
> (i.e.  B), to go back to the original branch before switching to B,
> and then to unstash on the working tree of the original branch that
> is checked out after aborting.
Show 8 quoted lines
> Note that such an alternative design would have had its own issues.
> With such a different semantics of two-arg form, if a rebase cleanly
> finishes, instead of staying on the rebased branch B, we MUST go
> back to the original branch to unstash what was autostashed.
> Usually people expect after a rebase to play with the rebased state
> (e.g. test build), so staying on branch B that was just rebased
> would be far more usable than going back to unrelated original
> branch (and possibly unstashing).
> In any case, the ship has long sailed, so ...
I should try that usecases to have an opinion on that.

Currently I just add picture when `dev` is moved while rebasing. This does not occur when `local/dev` does not point to `dev` (when `local/dev/` and `dev` point different commits)

Also I will try --onto and how it suits to my work flow.
-- 
Best regards,
Eugen Konkov
Previous: Junio C HamanoNext: Johannes Schindelin
Message 7 of 9 in “git rebase/git rebase --abort cause inconsistent state”
  1. Eugen KonkovNov 6, 2020
  2. Eugen KonkovNov 6, 2020
  3. Elijah NewrenNov 6, 2020
  4. Johannes SixtNov 6, 2020
  5. Eugen KonkovNov 9, 2020
  6. Junio C HamanoNov 9, 2020
  7. Eugen KonkovNov 10, 2020
  8. Johannes SchindelinNov 10, 2020
  9. Johannes SixtNov 11, 2020

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.