From: "Harald Nordgren via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Kristoffer Haugsbakk <kristofferhaugsbakk@fastmail.com>,
"D. Ben Knoble" <ben.knoble@gmail.com>,
Phillip Wood <phillip.wood123@gmail.com>,
Harald Nordgren <haraldnordgren@gmail.com>
Subject: [PATCH v4 0/2] reflog: add format %gb
Date: Wed, 04 Nov 2026 21:15:36 +0000 [thread overview]
Message-ID: <pull.2448.v4.git.git.1793826938.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.2448.git.git.1792070038.gitgitgadget@gmail.com>
Create a better reflog. Follows the discussion in
https://lore.kernel.org/git/akZfm-igZKeHaDST@pks.im/.
The reflog of HEAD records the work done on every branch, so "git reflog"
mixes them and does not say which entry was made on which branch. This adds
a "%gb" placeholder that names the branch HEAD was on when each entry was
recorded:
$ git log -g --format='%h %gd: (%gb) %gs'
9c8d7e6 HEAD@{0}: (topic) rebase (finish): returning to refs/heads/topic
1a2b3c4 HEAD@{2}: (topic) rebase (start): checkout main
1a2b3c4 HEAD@{3}: (main) commit: fix typo
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 ".
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 &&
--
gitgitgadget
next prev parent reply other threads:[~2026-11-04 21:15 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 ` Harald Nordgren via GitGitGadget [this message]
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 ` [PATCH v4 0/2] reflog: add format %gb Phillip Wood
2026-11-07 9:59 ` 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=pull.2448.v4.git.git.1793826938.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=ben.knoble@gmail.com \
--cc=git@vger.kernel.org \
--cc=haraldnordgren@gmail.com \
--cc=kristofferhaugsbakk@fastmail.com \
--cc=phillip.wood123@gmail.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.