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

minor interactive rebase regression: HEAD points to wrong commit while rewording

From
SZEDER Gábor <szeder.dev@gmail.com>
Date
Aug 12, 2019, 17:50 UTC
Message-ID
<20190812175046.GM20404@szeder.dev>

When running interactive rebase to reword a commit message, I would expect that the commit whose message I'm rewording is checked out. This is not quite the case when rewording multiple subsequent commit messages.

Let's start with four commits, and start an interactive rebase from the first commit:

  $ git log --oneline
  5835aa1 (HEAD -> master) fourth
  64ecc64 third
  d5fad83 second
  384b86f first
  $ git rebase -i 384b86f

Update the instruction sheet to edit the log messages of two subsequent commits:

  r d5fad83 second
  r 64ecc64 third
  pick 5835aa1 fourth

Now, after the editor opens up the second commit's log message, start a new terminal and check where HEAD is pointing to:

  ~/tmp/reword (master|REBASE-i 1/3)$ head -n1 .git/COMMIT_EDITMSG 
  second
  ~/tmp/reword (master|REBASE-i 1/3)$ git log --oneline -1
  d5fad83 (HEAD) second

So far so good. Save the updated commit message, and after the editor opens up the third commit's log message, check again where HEAD is pointing to now:

  ~/tmp/reword (master +|REBASE-i 2/3)$ head -n1 .git/COMMIT_EDITMSG 
  third
  ~/tmp/reword (master +|REBASE-i 2/3)$ git log --oneline -1
  c3db735 (HEAD) second - updated

As you can see, HEAD still points to the (now rewritten) second commit.

It's only HEAD, though: notice the '+' in the git prompt, indicating that both the worktree and index are dirty. And indeed, they both already match the state of the currently reworded, i.e. third, commit:

  ~/tmp/reword (master +|REBASE-i 2/3)$ cat file
  third

This is good, because even though HEAD has not been updated yet, it already allows users to take a look at the "big picture", i.e. actual file contents, in case the diff included in the commit message template doesn't show enough context.

This behavior changed in commit 18633e1a22 (rebase -i: use the rebase--helper builtin, 2017-02-09); prior to that HEAD pointed to the third commit while editing its log message.

It's important to reword subsequent commits. When rewording multiple, but non subsequent commits (e.g. reword, pick, reword in the instruction sheet), then HEAD is pointing to the right commits during both rewords.

Next: Junio C Hamano
Message 1 of 10 in “minor interactive rebase regression: HEAD points to wrong commit while rewording”
  1. SZEDER GáborAug 12, 2019
  2. Junio C HamanoAug 12, 2019
  3. SZEDER GáborAug 12, 2019
  4. Phillip WoodAug 12, 2019
  5. Johannes SchindelinAug 14, 2019
  6. SZEDER GáborAug 14, 2019
  7. SZEDER GáborAug 14, 2019
  8. Phillip WoodAug 15, 2019
  9. Junio C HamanoAug 15, 2019
  10. Junio C HamanoAug 15, 2019

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.