From: Phillip Wood <phillip.wood123@gmail.com>
To: Harald Nordgren via GitGitGadget <gitgitgadget@gmail.com>,
git@vger.kernel.org
Cc: Kristoffer Haugsbakk <kristofferhaugsbakk@fastmail.com>,
"D. Ben Knoble" <ben.knoble@gmail.com>,
Harald Nordgren <haraldnordgren@gmail.com>
Subject: Re: [PATCH v4 0/2] reflog: add format %gb
Date: Fri, 6 Nov 2026 11:08:05 +0000 [thread overview]
Message-ID: <edd1c36a-bd2a-4bcf-a6b1-3e08dfcda344@gmail.com> (raw)
In-Reply-To: <pull.2448.v4.git.git.1793826938.gitgitgadget@gmail.com>
Hi Harald
On 04/11/2026 21:15, Harald Nordgren via GitGitGadget wrote:
>
> It follows branch switches, branch renames and rebases, including "git
> rebase ", rebases of a detached HEAD and rebases of a branch that was
> already up to date. When HEAD was detached, the entry shows "detached at ".
The "detached at " labels show the commit before we switch away from a
detached HEAD, not the commit where HEAD was detached. The parsing of
"rebase: checkout <revision>" is still not quite right - it treats
"origin/main" as a branch name and is confused by commits where the
subject starts with "checkout " (I think the way to avoid that is to
check that the reflog message does not match the commit subject [1]).
Here is a failing test for those issues which also checks we handle
':' in a url in $GIT_REFLOG_ACTION correctly.
test_expect_success '%gb labels branches and detached HEADs' '
test_create_repo origin &&
(
cd origin &&
test_commit O1 &&
test_commit O2
) &&
git clone origin downstream &&
(
cd origin &&
test_commit O3
) &&
(
cd downstream &&
test_commit L1 &&
git branch side &&
test_commit L2 &&
git pull -r "file://$TRASH_DIRECTORY/origin" &&
test_commit L3 &&
GIT_REFLOG_ACTION="sync switch" git rebase -i FETCH_HEAD side^0 &&
H1=$(git rev-parse --short HEAD) &&
test_commit "checkout main" L4.t L4 L4 &&
git rebase FETCH_HEAD side &&
test_commit L5 &&
git rebase origin/main origin/main &&
H2=$(git rev-parse --short HEAD) &&
test_commit L6 &&
git rebase main refs/heads/main &&
H3=$(git rev-parse --short HEAD) &&
test_commit L7 &&
git switch side &&
test_commit L8 &&
git checkout origin/main &&
H4=$(git rev-parse --short HEAD) &&
test_commit L9 &&
cat >expect <<-EOF &&
commit: l9 (detached at $H4) &&
checkout: moving from side to origin/main (detached at $H4)
commit: L8 (side)
checkout: moving from $(git rev-parse L7) to side (side)
commit: L7 (detached at $H3)
rebase: checkout refs/heads/main (detached at $H3)
commit: L6 (detached at $H2)
rebase: checkout origin/main (detached at $H2)
commit: L5 (side)
rebase (finish): returning to refs/heads/side (side)
rebase (pick): L1 (side)
rebase (start): checkout FETCH_HEAD (side)
commit: checkout main (detached at $H1)
sync switch (pick): L1 (detached at $H1)
sync switch (start): checkout FETCH_HEAD (detached at $H1)
commit: L3 (main)
pull -r file://$TRASH_DIRECTORY/origin (finish): returning to refs/heads/main (main)
pull -r file://$TRASH_DIRECTORY/origin (pick): L2 (main)
pull -r file://$TRASH_DIRECTORY/origin (pick): L1 (main)
pull -r file://$TRASH_DIRECTORY/origin (start): checkout $(git rev-parse FETCH_HEAD) (main)
commit: L2 (main)
commit: L1 (main)
clone: from $TRASH_DIRECTORY/origin (main)
EOF
git log -g --format="%gs (%gb)" >actual &&
test_cmp expect actual
)
'
Thanks
Phillip
[1] https://github.com/phillipwood/git/blob/c11b0dcb38d4dbe26c41053569d4fae27fdf0de6/object-name.c#L1301
>
> Changes in v4:
>
> * %gb now names the right branch when git rebase <upstream> <branch> runs
> with GIT_REFLOG_ACTION set.
> * Reworded the %gb commit message.
>
> Changes in v3:
>
> * Dropped --operations.
> * Replaced --historical-branch with a %gb placeholder for --format, e.g.
> git log -g --format='%h %gd: (%gb) %gs'.
> * %gb names the right branch after git rebase <upstream> <branch>, a rebase
> of a detached HEAD and an up-to-date rebase.
> * Named the returning to and checkout reflog strings in reflog.h too.
>
> Changes in v2:
>
> * Move the "historical branch" rightward in the display for cleaner
> alignment.
> * Improve commit messages.
>
> Harald Nordgren (2):
> reflog: name the strings that mark switches, renames and rebase steps
> pretty: add %gb to name the branch of each reflog entry
>
> Documentation/pretty-formats.adoc | 3 +
> builtin/branch.c | 3 +-
> builtin/checkout.c | 3 +-
> builtin/rebase.c | 19 ++--
> object-name.c | 3 +-
> pretty.c | 4 +
> reflog-walk.c | 167 ++++++++++++++++++++++++++++--
> reflog-walk.h | 2 +
> reflog.h | 8 ++
> sequencer.c | 13 +--
> t/t1414-reflog-walk.sh | 137 ++++++++++++++++++++++++
> wt-status.c | 3 +-
> 12 files changed, 340 insertions(+), 25 deletions(-)
>
>
> base-commit: 750f5de7dfe9a4062f95088212b063f189d50e91
> Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-2448%2FHaraldNordgren%2Freflog-operations-v4
> Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-2448/HaraldNordgren/reflog-operations-v4
> Pull-Request: https://github.com/git/git/pull/2448
>
> Range-diff vs v3:
>
> 1: 4d779e8da3 = 1: f960a24b8b reflog: name the strings that mark switches, renames and rebase steps
> 2: dee548f9b1 ! 2: 99a1047702 pretty: add %gb to name the branch of each reflog entry
> @@ Commit message
> 1a2b3c4 HEAD@{3}: (main) commit: fix typo
> 5d6e7f8 HEAD@{4}: (main) checkout: moving from topic to main
>
> - The branch is read from the entries that branch switches, branch
> - renames and rebases leave behind. The entries of a rebase are named
> - after the branch being rebased. When HEAD was detached, the entry
> - shows "detached at <commit>" with the commit HEAD was at when it
> - moved on. When nothing older in the reflog says which branch a rebase
> - started on, the rebase is taken to have started on the branch it
> - rebased. For the reflog of any other ref, "%gb" is the name of that
> - ref.
> + The branch is read from the entries created by branch switches,
> + branch renames and rebases. The entries of a rebase are labeled with
> + the branch being rebased. When HEAD was detached, the entry shows
> + "detached at <commit>" with the commit HEAD was at when it moved on.
> + When nothing older in the reflog says which branch a rebase started
> + on, the rebase is taken to have started on the branch it rebased. For
> + the reflog of any other ref, "%gb" is the name of that ref.
>
> Signed-off-by: Harald Nordgren <haraldnordgren@gmail.com>
>
> @@ reflog-walk.c: static void complete_reflogs_clear(void *util, const char *str UN
> + return p;
> +}
> +
> ++static const char *skip_rebase_checkout(const char *message)
> ++{
> ++ const char *p = strstr(message, " (");
> ++ const char *colon = strstr(message, ": ");
> ++
> ++ if (!colon || (p && p < colon) ||
> ++ !skip_prefix(colon + 2, REFLOG_CHECKOUT, &p))
> ++ return NULL;
> ++ return p;
> ++}
> ++
> +struct branch_move {
> + const char *from, *to;
> + size_t from_len, to_len;
> @@ reflog-walk.c: static void complete_reflogs_clear(void *util, const char *str UN
> + skip_prefix(to, REFLOG_RETURNING_TO, &to)) {
> + move->from = move->to = to;
> + move->from_len = strcspn(to, "\n");
> -+ } else if (skip_prefix(message, "rebase: " REFLOG_CHECKOUT, &to)) {
> ++ } else if ((to = skip_rebase_checkout(message))) {
> + move->to = to;
> + } else if (!skip_rebase_step(message, REFLOG_STEP_START)) {
> + return false;
> @@ t/t1414-reflog-walk.sh: test_expect_success 'walk prefers reflog to ref tip' '
> + )
> +'
> +
> ++test_expect_success '%gb follows "git rebase <upstream> <branch>" with GIT_REFLOG_ACTION' '
> ++ (
> ++ cd branches &&
> ++ git switch main &&
> ++ GIT_REFLOG_ACTION="sync switch" git rebase main topic &&
> ++
> ++ cat >expect <<-\EOF &&
> ++ (topic) sync switch: checkout topic
> ++ (main) checkout: moving from topic to main
> ++ EOF
> ++ git log -g -2 --format="(%gb) %gs" >actual &&
> ++ test_cmp expect actual
> ++ )
> ++'
> ++
> +test_expect_success '%gb names a detached HEAD by the commit it was left at' '
> + (
> + cd branches &&
>
next prev parent reply other threads:[~2026-11-06 11:08 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-15 13:13 [PATCH 0/3] reflog: add --operations and --historical-branch Harald Nordgren via GitGitGadget
2026-10-15 13:13 ` [PATCH 1/3] reflog: name the strings that mark switches, renames and rebase steps Harald Nordgren via GitGitGadget
2026-10-15 14:35 ` Kristoffer Haugsbakk
2026-10-15 20:52 ` Harald Nordgren
2026-10-15 13:13 ` [PATCH 2/3] reflog: add --operations to show one entry per command Harald Nordgren via GitGitGadget
2026-10-15 13:13 ` [PATCH 3/3] reflog: add --historical-branch to name the branch of each entry Harald Nordgren via GitGitGadget
2026-10-15 14:36 ` [PATCH 0/3] reflog: add --operations and --historical-branch Kristoffer Haugsbakk
2026-10-15 15:24 ` Harald Nordgren
2026-10-15 15:35 ` Kristoffer Haugsbakk
2026-10-15 20:47 ` Harald Nordgren
2026-10-16 18:26 ` D. Ben Knoble
2026-10-23 15:31 ` Harald Nordgren
2026-10-16 18:36 ` D. Ben Knoble
2026-10-17 10:03 ` Harald Nordgren
2026-10-18 18:27 ` [PATCH v2 " Harald Nordgren via GitGitGadget
2026-10-18 18:27 ` [PATCH v2 1/3] reflog: name the strings that mark switches, renames and rebase steps Harald Nordgren via GitGitGadget
2026-10-23 21:19 ` Junio C Hamano
2026-10-23 22:47 ` Harald Nordgren
2026-10-23 22:55 ` Junio C Hamano
2026-10-18 18:27 ` [PATCH v2 2/3] reflog: add --operations to show one entry per command Harald Nordgren via GitGitGadget
2026-10-18 18:27 ` [PATCH v2 3/3] reflog: add --historical-branch to name the branch of each entry Harald Nordgren via GitGitGadget
2026-10-25 19:18 ` Kristoffer Haugsbakk
2026-10-25 20:22 ` Harald Nordgren
2026-10-26 8:39 ` Kristoffer Haugsbakk
2026-10-26 8:42 ` Harald Nordgren
2026-10-23 15:32 ` [PATCH v2 0/3] reflog: add --operations and --historical-branch Harald Nordgren
2026-10-24 13:51 ` Phillip Wood
2026-10-24 15:22 ` D. Ben Knoble
2026-10-24 16:40 ` Junio C Hamano
2026-10-24 18:46 ` Harald Nordgren
2026-10-25 18:52 ` Kristoffer Haugsbakk
2026-10-26 10:52 ` Phillip Wood
2026-10-26 11:00 ` Harald Nordgren
2026-10-26 15:07 ` Junio C Hamano
2026-10-27 13:40 ` Ben Knoble
2026-10-27 19:24 ` Junio C Hamano
2026-10-27 19:33 ` Harald Nordgren
2026-10-27 13:37 ` Ben Knoble
2026-10-24 19:12 ` Harald Nordgren
2026-10-27 8:38 ` [PATCH v3 0/2] " Harald Nordgren via GitGitGadget
2026-10-27 8:38 ` [PATCH v3 1/2] reflog: name the strings that mark switches, renames and rebase steps Harald Nordgren via GitGitGadget
2026-10-27 8:38 ` [PATCH v3 2/2] pretty: add %gb to name the branch of each reflog entry Harald Nordgren via GitGitGadget
2026-11-03 16:16 ` Phillip Wood
2026-11-04 21:15 ` [PATCH v4 0/2] reflog: add format %gb Harald Nordgren via GitGitGadget
2026-11-04 21:15 ` [PATCH v4 1/2] reflog: name the strings that mark switches, renames and rebase steps Harald Nordgren via GitGitGadget
2026-11-04 21:15 ` [PATCH v4 2/2] pretty: add %gb to name the branch of each reflog entry Harald Nordgren via GitGitGadget
2026-11-06 11:08 ` Phillip Wood [this message]
2026-11-07 9:59 ` [PATCH v4 0/2] reflog: add format %gb Harald Nordgren
2026-11-07 11:55 ` [PATCH v5 " Harald Nordgren via GitGitGadget
2026-11-07 11:55 ` [PATCH v5 1/2] reflog: name the strings that mark switches, renames and rebase steps Harald Nordgren via GitGitGadget
2026-11-07 11:55 ` [PATCH v5 2/2] pretty: add %gb to name the branch of each reflog entry Harald Nordgren via GitGitGadget
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=edd1c36a-bd2a-4bcf-a6b1-3e08dfcda344@gmail.com \
--to=phillip.wood123@gmail.com \
--cc=ben.knoble@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitgitgadget@gmail.com \
--cc=haraldnordgren@gmail.com \
--cc=kristofferhaugsbakk@fastmail.com \
--cc=phillip.wood@dunelm.org.uk \
/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