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

Re: [BUG?] 'git rebase --abort' couldn't abort aborted rebase

From
SZEDER Gábor <szeder.dev@gmail.com>
Date
Feb 7, 2020, 11:49 UTC
Message-ID
<20200207114954.GB2868@szeder.dev>
In-Reply-To
<20200207111008.GA2868@szeder.dev>
On Fri, Feb 07, 2020 at 12:10:08PM +0100, SZEDER Gábor wrote:
Show 32 quoted lines
> That's a good subject, isn't it? :)
> 
> So, to clarify: apparently it is possible to abort an ongoing 'git
> rebase' process with ctrl-C in just the right moment that a subsequent
> 'git rebase --abort' will refuse to clear it up.
> 
> I somehow messed up the upstream and branch parameters of 'git
> rebase', and ended up trying to rebase a fairly recent (post v2.24.0)
> branch on top of v2.22.0.  Upon seeing the unexpectedly large number
> of patches I realized that something is wrong, hit ctrl-C right away,
> and this is what happened:
> 
>   $ git rebase v2.22.0 <a-branch-on-top-of-2.24.0>
>   First, rewinding head to replay your work on top of it...
>   Generating patches: 100% (1108/1108), done.
>   Applying: send-email: move the read_config() function above getopts
>   Applying: send-email: rename the @bcclist variable for consistency
>   Applying: send-email: do defaults -> config -> getopt in that order
>   Using index info to reconstruct a base tree...
>   M       git-send-email.perl
>   M       t/t9001-send-email.sh
>   Falling back to patching base and 3-way merge...
>   Auto-merging t/t9001-send-email.sh
>   Auto-merging git-send-email.perl
>   ^C
>   ((5f07da12ac...) *|REBASE 3/1108)$ git rebase --abort 
>   error: could not read '/home/szeder/src/git/.git/worktrees/WT/rebase-apply/head-name': No such file or directory
>    
> "Fortunately" it was in a separate worktree, so I could easily get out
> of the situation by forcibly deleting that worktree.  Unfortunately,
> that was exactly what I did, instead of securing the failed state for
> later analysis...  sorry.
> All this is with a git built from current 'next', with a bunch of
> unrelated (none of them touches rebase or the sequencer) patches on
> top.
Trying to reproduce it is a hit or miss... well, mostly miss :)

There is a rather short window when 'git rebase' applies patches before hitting a first merge conflict. If the ctrl-C arrives before 'git rebase' starts applying patches, then it cleans everything up, and we are not rebasing, so there is no need for 'git rebase --abort'. Once 'git rebase' stops because of the merge conflict we get our shell back, and 'git rebase --abort' works as it should. But after a good couple of tries I managed to hit ctrl-C while 'git rebase' was applying patches:

  $ ./BUILDS/v2.25.0/bin/git rebase v2.22.0 v2.24.0^{commit}
  First, rewinding head to replay your work on top of it...
  Generating patches: 100% (1049/1049), done.
  Applying: send-email: move the read_config() function above getopts
  ^C
  ((v2.22.0) +|REBASE 1/1049)$ ./BUILDS/v2.25.0/bin/git rebase --abort
  error: could not read '.git/rebase-apply/head-name': No such file or directory

Note that I'm using v2.25.0 here, so the problem is not with 'next' or with my patches. Also note that I reproduced the error in the main worktree, and only using commits that are present in git.git.

Finally, note the 'v2.24.0^{commit}' parameter, in particular the '^{commit}' part. That's important, because without it we stumble upon _another_ bug:

  $ git rebase v2.22.0 v2.24.0
  error: Object 1cc4bc0fcd93f816d514d77c29f2cc9ffdd8ae09 not a commit
  First, rewinding head to replay your work on top of it...
  Generating patches: 100% (1049/1049), done.
  Applying: send-email: move the read_config() function above getopts
  < ... applying further patches and hitting a merge conflict ... >
  Resolve all conflicts manually, mark them as resolved with
  "git add/rm <conflicted_files>", then run "git rebase --continue".
  You can instead skip this commit: run "git rebase --skip".
  To abort and get back to the state before "git rebase", run "git rebase --abort".
  (detached HEAD *+|REBASE 7/1049)$ git rebase --abort 
  error: update_ref failed for ref 'HEAD': cannot update ref 'HEAD': trying to write non-commit object 1cc4bc0fcd93f816d514d77c29f2cc9ffdd8ae09 to branch 'HEAD'

So 'git rebase' shows an error right at the beginning when rebasing a tag, but then continues anyway. However, 'git rebase --abort' can't restore the original state.

Previous: SZEDER GáborNext: SZEDER Gábor
Message 2 of 4 in “[BUG?] 'git rebase --abort' couldn't abort aborted rebase”
  1. SZEDER GáborFeb 7, 2020
  2. SZEDER GáborFeb 7, 2020
  3. SZEDER GáborFeb 7, 2020
  4. Elijah NewrenFeb 7, 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.