From: "Harald Nordgren via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Harald Nordgren <haraldnordgren@gmail.com>
Subject: [PATCH v26 0/2] status: add status.compareBranches config for multiple branch comparisons
Date: Sun, 18 Jan 2026 19:59:11 +0000 [thread overview]
Message-ID: <pull.2138.v26.git.git.1768766353.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.2138.v25.git.git.1768306316.gitgitgadget@gmail.com>
cc: Chris Torek chris.torek@gmail.com cc: Yee Cheng Chin
ychin.macvim@gmail.com cc: "brian m. carlson" sandals@crustytoothpaste.net
cc: Ben Knoble ben.knoble@gmail.com cc: "Kristoffer Haugsbakk"
kristofferhaugsbakk@fastmail.com cc: Phillip Wood phillip.wood123@gmail.com
cc: Nico Williams nico@cryptonector.com cc: Patrick Steinhardt ps@pks.im cc:
Jeff King peff@peff.net
Harald Nordgren (2):
refactor format_branch_comparison in preparation
status: add status.compareBranches config for multiple branch
comparisons
Documentation/config/status.adoc | 20 ++
remote.c | 187 ++++++++++++++----
t/t6040-tracking-info.sh | 322 +++++++++++++++++++++++++++++++
3 files changed, 492 insertions(+), 37 deletions(-)
base-commit: b5c409c40f1595e3e590760c6f14a16b6683e22c
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-2138%2FHaraldNordgren%2Fahead_of_main_status-v26
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-2138/HaraldNordgren/ahead_of_main_status-v26
Pull-Request: https://github.com/git/git/pull/2138
Range-diff vs v25:
1: fd05c7b778 = 1: 27a46f8d9c refactor format_branch_comparison in preparation
2: fa744efc59 ! 2: caa761f615 status: show comparison with push remote tracking branch
@@ Metadata
Author: Harald Nordgren <haraldnordgren@gmail.com>
## Commit message ##
- status: show comparison with push remote tracking branch
+ status: add status.compareBranches config for multiple branch comparisons
- "git status" on a branch that follows a remote branch compares
- commits on the current branch and the remote-tracking branch it
- builds upon, to show "ahead", "behind", or "diverged" status.
+ Add a new configuration variable `status.compareBranches` that allows
+ users to specify a space-separated list of branches to compare against
+ the current branch in `git status` output.
- When working on a feature branch that tracks a remote feature branch,
- but you also want to track progress relative to the push destination
- tracking branch (which may differ from the upstream branch), git status
- now shows an additional comparison.
+ Each branch in the list can be:
+ - A remote-tracking branch name (e.g., `origin/main`)
+ - The special reference `@{upstream}` for the tracking branch
+ - The special reference `@{push}` for the push destination
- When the upstream tracking branch differs from the push destination
- tracking branch, git status shows both the comparison with the upstream
- tracking branch (as before) and an additional comparison with the push
- destination tracking branch. The push branch comparison appears on a
- separate line after the upstream branch status, using the same format.
+ When not configured, the default behavior is equivalent to setting
+ `status.compareBranches = @{upstream}`, preserving backward compatibility.
- Example output when tracking origin/main but push destination is
- origin/feature:
- On branch feature
- Your branch and 'origin/main' have diverged,
- and have 3 and 1 different commits each, respectively.
- (use "git pull" if you want to integrate the remote branch with yours)
+ The advice messages shown are context-aware:
+ - "git pull" advice is shown only when comparing against @{upstream}
+ - "git push" advice is shown only when comparing against @{push}
+ - Divergence advice is shown for upstream branch comparisons
- Your branch is ahead of 'origin/feature' by 1 commit.
- (use "git push" to publish your local commits)
+ This is useful for triangular workflows where the upstream tracking
+ branch differs from the push destination, allowing users to see their
+ status relative to both branches at once.
- The comparison is only shown when the push destination tracking branch
- differs from the upstream tracking branch, even if they are on the same
- remote.
+ Example configuration:
+ [status]
+ compareBranches = @{upstream} @{push}
Signed-off-by: Harald Nordgren <haraldnordgren@gmail.com>
+ ## Documentation/config/status.adoc ##
+@@ Documentation/config/status.adoc: status.aheadBehind::
+ `--no-ahead-behind` by default in linkgit:git-status[1] for
+ non-porcelain status formats. Defaults to true.
+
++status.compareBranches::
++ A space-separated list of branches to compare the current branch
++ against in linkgit:git-status[1]. Each branch specification can be
++ a remote-tracking branch name (e.g. `origin/main`), or a special
++ reference like `@{upstream}` or `@{push}`. For each branch in the
++ list, git status shows whether the current branch is ahead, behind,
++ or has diverged from that branch.
+++
++If not set, the default behavior is equivalent to `@{upstream}`, which
++compares against the configured upstream tracking branch.
+++
++Example:
+++
++----
++[status]
++ compareBranches = origin/main origin/develop
++----
+++
++This would show comparisons against both `origin/main` and `origin/develop`.
++
+ status.displayCommentPrefix::
+ If set to true, linkgit:git-status[1] will insert a comment
+ prefix before each output line (starting with
+
## remote.c ##
@@
@@ remote.c
struct counted_string {
size_t len;
const char *s;
+@@ remote.c: static void branch_release(struct branch *branch)
+ free((char *)branch->refname);
+ free(branch->remote_name);
+ free(branch->pushremote_name);
++ free((char *)branch->push_tracking_ref);
+ merge_clear(branch);
+ }
+
@@ remote.c: int stat_tracking_info(struct branch *branch, int *num_ours, int *num_theirs,
return stat_branch_pair(branch->refname, base, num_ours, num_theirs, abf);
}
-+static char *get_remote_push_branch(struct branch *branch)
++static char *resolve_compare_branch(struct branch *branch, const char *name)
+{
-+ struct remote *remote;
-+ const char *push_remote;
-+ char *push_dst = NULL;
-+ char *tracking_ref;
-+ const char *resolved;
++ struct strbuf buf = STRBUF_INIT;
++ const char *resolved = NULL;
+ char *ret;
+
-+ if (!branch)
-+ return NULL;
-+
-+ push_remote = pushremote_for_branch(branch, NULL);
-+ if (!push_remote)
++ if (!branch || !name)
+ return NULL;
+
-+ remote = remotes_remote_get(the_repository, push_remote);
-+ if (!remote)
-+ return NULL;
++ if (!strcasecmp(name, "@{upstream}") || !strcasecmp(name, "@{u}"))
++ resolved = branch_get_upstream(branch, NULL);
++ else if (!strcasecmp(name, "@{push}"))
++ resolved = branch_get_push(branch, NULL);
+
-+ push_dst = remote_ref_for_branch(branch, 1);
-+ if (!push_dst) {
-+ if (remote->push.nr)
-+ return NULL;
-+ push_dst = xstrdup(branch->refname);
-+ }
-+
-+ tracking_ref = (char *)tracking_for_push_dest(remote, push_dst, NULL);
-+ free(push_dst);
-+
-+ if (!tracking_ref)
-+ return NULL;
++ if (resolved)
++ return xstrdup(resolved);
+
++ strbuf_addf(&buf, "refs/remotes/%s", name);
+ resolved = refs_resolve_ref_unsafe(
+ get_main_ref_store(the_repository),
-+ tracking_ref,
++ buf.buf,
+ RESOLVE_REF_READING,
+ NULL, NULL);
-+
-+ if (!resolved) {
-+ free(tracking_ref);
-+ return NULL;
++ if (resolved) {
++ ret = xstrdup(resolved);
++ strbuf_release(&buf);
++ return ret;
+ }
+
-+ ret = xstrdup(resolved);
-+ free(tracking_ref);
-+ return ret;
++ strbuf_release(&buf);
++ return NULL;
+}
+
static void format_branch_comparison(struct strbuf *sb,
@@ remote.c: static void format_branch_comparison(struct strbuf *sb,
_(" (use \"git pull\" if you want to integrate the remote branch with yours)\n"));
}
@@ remote.c: int format_tracking_info(struct branch *branch, struct strbuf *sb,
- const char *full_base;
- char *base;
- int upstream_is_gone = 0;
-+ unsigned base_branch_flags = ENABLE_ADVICE_PULL | ENABLE_ADVICE_PUSH;
-+ int push_ours, push_theirs, push_cmp_fetch;
-+ char *full_push;
-+ char *push = NULL;
-+ unsigned push_branch_flags = 0;
+ enum ahead_behind_flags abf,
+ int show_divergence_advice)
+ {
+- int ours, theirs, cmp_fetch;
+- const char *full_base;
+- char *base;
+- int upstream_is_gone = 0;
+-
+- cmp_fetch = stat_tracking_info(branch, &ours, &theirs, &full_base, 0, abf);
+- if (cmp_fetch < 0) {
+- if (!full_base)
+- return 0;
+- upstream_is_gone = 1;
++ char *compare_branches_config = NULL;
++ struct string_list compare_branches = STRING_LIST_INIT_DUP;
++ struct string_list_item *item;
++ int reported = 0;
++ size_t i;
++ const char *upstream_ref;
++ const char *push_ref;
++
++ repo_config_get_string(the_repository, "status.comparebranches",
++ &compare_branches_config);
++
++ if (compare_branches_config) {
++ string_list_split(&compare_branches, compare_branches_config,
++ " ", -1);
++ string_list_remove_empty_items(&compare_branches, 0);
++ } else {
++ string_list_append(&compare_branches, "@{upstream}");
+ }
- cmp_fetch = stat_tracking_info(branch, &ours, &theirs, &full_base, 0, abf);
- if (cmp_fetch < 0) {
-@@ remote.c: int format_tracking_info(struct branch *branch, struct strbuf *sb,
- base = refs_shorten_unambiguous_ref(get_main_ref_store(the_repository),
- full_base, 0);
+- base = refs_shorten_unambiguous_ref(get_main_ref_store(the_repository),
+- full_base, 0);
++ upstream_ref = branch_get_upstream(branch, NULL);
++ push_ref = branch_get_push(branch, NULL);
-+ full_push = get_remote_push_branch(branch);
-+ if (full_push) {
-+ push = refs_shorten_unambiguous_ref(get_main_ref_store(the_repository),
-+ full_push, 0);
-+ if (push && base && strcmp(base, push)) {
-+ push_cmp_fetch = stat_branch_pair(branch->refname, full_push,
-+ &push_ours, &push_theirs, abf);
-+ if (push_cmp_fetch >= 0) {
-+ base_branch_flags = ENABLE_ADVICE_PULL;
-+ push_branch_flags = ENABLE_ADVICE_PUSH;
+- if (upstream_is_gone) {
+- strbuf_addf(sb,
+- _("Your branch is based on '%s', but the upstream is gone.\n"),
+- base);
+- if (advice_enabled(ADVICE_STATUS_HINTS))
+- strbuf_addstr(sb,
+- _(" (use \"git branch --unset-upstream\" to fixup)\n"));
+- } else {
+- format_branch_comparison(sb, !cmp_fetch, ours, theirs, base, abf, show_divergence_advice);
++ for (i = 0; i < compare_branches.nr; i++) {
++ char *full_ref;
++ char *short_ref;
++ int ours, theirs, cmp;
++ int is_upstream, is_push;
++ unsigned flags = 0;
++
++ item = &compare_branches.items[i];
++ full_ref = resolve_compare_branch(branch, item->string);
++ if (!full_ref)
++ continue;
++
++ short_ref = refs_shorten_unambiguous_ref(
++ get_main_ref_store(the_repository), full_ref, 0);
++
++ is_upstream = upstream_ref && !strcmp(full_ref, upstream_ref);
++ is_push = push_ref && !strcmp(full_ref, push_ref);
++
++ if (is_upstream && (!push_ref || !strcmp(upstream_ref, push_ref)))
++ is_push = 1;
++
++ cmp = stat_branch_pair(branch->refname, full_ref,
++ &ours, &theirs, abf);
++
++ if (cmp < 0) {
++ if (is_upstream) {
++ strbuf_addf(sb,
++ _("Your branch is based on '%s', but the upstream is gone.\n"),
++ short_ref);
++ if (advice_enabled(ADVICE_STATUS_HINTS))
++ strbuf_addstr(sb,
++ _(" (use \"git branch --unset-upstream\" to fixup)\n"));
++ reported = 1;
+ }
++ free(full_ref);
++ free(short_ref);
++ continue;
+ }
-+ }
+
- if (upstream_is_gone) {
- strbuf_addf(sb,
- _("Your branch is based on '%s', but the upstream is gone.\n"),
-@@ remote.c: int format_tracking_info(struct branch *branch, struct strbuf *sb,
- strbuf_addstr(sb,
- _(" (use \"git branch --unset-upstream\" to fixup)\n"));
- } else {
-- format_branch_comparison(sb, !cmp_fetch, ours, theirs, base, abf, show_divergence_advice);
-+ if (show_divergence_advice)
-+ base_branch_flags |= ENABLE_ADVICE_DIVERGENCE;
-+ format_branch_comparison(sb, !cmp_fetch, ours, theirs, base, abf,
-+ base_branch_flags);
-+ }
-+
-+ if (push_branch_flags & ENABLE_ADVICE_PUSH) {
-+ strbuf_addstr(sb, "\n");
-+ format_branch_comparison(sb, !push_cmp_fetch, push_ours, push_theirs, push, abf,
-+ push_branch_flags);
++ if (reported)
++ strbuf_addstr(sb, "\n");
++
++ if (is_upstream)
++ flags |= ENABLE_ADVICE_PULL;
++ if (is_push)
++ flags |= ENABLE_ADVICE_PUSH;
++ if (show_divergence_advice && is_upstream)
++ flags |= ENABLE_ADVICE_DIVERGENCE;
++ format_branch_comparison(sb, !cmp, ours, theirs, short_ref,
++ abf, flags);
++ reported = 1;
++
++ free(full_ref);
++ free(short_ref);
}
- free(base);
-+ free(full_push);
-+ free(push);
- return 1;
+- free(base);
+- return 1;
++ string_list_clear(&compare_branches, 0);
++ free(compare_branches_config);
++ return reported;
}
+ static int one_local_ref(const struct reference *ref, void *cb_data)
## t/t6040-tracking-info.sh ##
@@ t/t6040-tracking-info.sh: test_expect_success '--set-upstream-to @{-1}' '
@@ t/t6040-tracking-info.sh: test_expect_success '--set-upstream-to @{-1}' '
+ test_cmp expect actual
+'
+
-+test_expect_success 'status shows ahead of both origin/main and feature branch' '
++test_expect_success 'setup for compareBranches tests' '
++ (
++ cd test &&
++ git config push.default current &&
++ git config status.compareBranches "@{upstream} @{push}"
++ )
++'
++
++test_expect_success 'status.compareBranches shows ahead of both upstream and push branch' '
+ (
+ cd test &&
+ git checkout -b feature2 origin/main &&
@@ t/t6040-tracking-info.sh: test_expect_success '--set-upstream-to @{-1}' '
+ test_cmp expect actual
+'
+
-+test_expect_success 'checkout shows ahead of both origin/main and feature branch' '
++test_expect_success 'checkout with status.compareBranches shows both branches' '
+ (
+ cd test &&
+ git checkout feature2 >../actual
@@ t/t6040-tracking-info.sh: test_expect_success '--set-upstream-to @{-1}' '
+ )
+'
+
-+test_expect_success 'status shows diverged from origin/main and ahead of feature branch' '
++test_expect_success 'status.compareBranches shows diverged and ahead' '
+ (
+ cd test &&
+ git checkout feature4 &&
@@ t/t6040-tracking-info.sh: test_expect_success '--set-upstream-to @{-1}' '
+ test_cmp expect actual
+'
+
-+test_expect_success 'status --no-ahead-behind shows diverged from origin/main and ahead of feature branch' '
++test_expect_success 'status --no-ahead-behind with status.compareBranches' '
+ (
+ cd test &&
+ git checkout feature4 &&
@@ t/t6040-tracking-info.sh: test_expect_success '--set-upstream-to @{-1}' '
+ )
+'
+
-+test_expect_success 'status with upstream remote and push.default set to origin' '
++test_expect_success 'status.compareBranches with upstream and origin remotes' '
+ (
+ cd test &&
+ git checkout -b feature5 upstream/main &&
@@ t/t6040-tracking-info.sh: test_expect_success '--set-upstream-to @{-1}' '
+ test_cmp expect actual
+'
+
-+test_expect_success 'status with upstream remote and push.default set to origin and diverged' '
++test_expect_success 'status.compareBranches with upstream and origin remotes multiple compare branches' '
+ (
+ cd test &&
+ git checkout -b feature6 upstream/main &&
++ git push origin &&
++ advance work &&
++ git -c status.compareBranches="upstream/main origin/feature6 origin/feature5" status >../actual
++ ) &&
++ cat >expect <<-EOF &&
++ On branch feature6
++ Your branch is ahead of ${SQ}upstream/main${SQ} by 1 commit.
++
++ Your branch is ahead of ${SQ}origin/feature6${SQ} by 1 commit.
++ (use "git push" to publish your local commits)
++
++ Your branch is ahead of ${SQ}origin/feature5${SQ} by 1 commit.
++
++ nothing to commit, working tree clean
++ EOF
++ test_cmp expect actual
++'
++
++test_expect_success 'status.compareBranches with diverged push branch' '
++ (
++ cd test &&
++ git checkout -b feature7 upstream/main &&
+ advance work &&
+ git push origin &&
+ git reset --hard upstream/main &&
@@ t/t6040-tracking-info.sh: test_expect_success '--set-upstream-to @{-1}' '
+ git status >../actual
+ ) &&
+ cat >expect <<-EOF &&
-+ On branch feature6
++ On branch feature7
+ Your branch is ahead of ${SQ}upstream/main${SQ} by 1 commit.
+
-+ Your branch and ${SQ}origin/feature6${SQ} have diverged,
++ Your branch and ${SQ}origin/feature7${SQ} have diverged,
+ and have 1 and 1 different commits each, respectively.
+
+ nothing to commit, working tree clean
@@ t/t6040-tracking-info.sh: test_expect_success '--set-upstream-to @{-1}' '
+ test_cmp expect actual
+'
+
-+test_expect_success 'status with upstream remote and push branch up to date' '
++test_expect_success 'status.compareBranches shows up to date branches' '
+ (
+ cd test &&
-+ git checkout -b feature7 upstream/main &&
++ git checkout -b feature8 upstream/main &&
+ git push origin &&
+ git status >../actual
+ ) &&
+ cat >expect <<-EOF &&
-+ On branch feature7
++ On branch feature8
+ Your branch is up to date with ${SQ}upstream/main${SQ}.
+
-+ Your branch is up to date with ${SQ}origin/feature7${SQ}.
++ Your branch is up to date with ${SQ}origin/feature8${SQ}.
+
+ nothing to commit, working tree clean
+ EOF
+ test_cmp expect actual
+'
+
-+test_expect_success 'status --no-ahead-behind with upstream remote and push branch up to date' '
++test_expect_success 'status --no-ahead-behind with status.compareBranches up to date' '
+ (
+ cd test &&
-+ git checkout feature7 &&
++ git checkout feature8 &&
+ git push origin &&
+ git status --no-ahead-behind >../actual
+ ) &&
+ cat >expect <<-EOF &&
-+ On branch feature7
++ On branch feature8
+ Your branch is up to date with ${SQ}upstream/main${SQ}.
+
-+ Your branch is up to date with ${SQ}origin/feature7${SQ}.
++ Your branch is up to date with ${SQ}origin/feature8${SQ}.
+
+ nothing to commit, working tree clean
+ EOF
+ test_cmp expect actual
+'
+
-+test_expect_success 'checkout shows push branch up to date' '
++test_expect_success 'checkout with status.compareBranches shows up to date' '
+ (
+ cd test &&
-+ git checkout feature7 >../actual
++ git checkout feature8 >../actual
+ ) &&
+ cat >expect <<-EOF &&
+ Your branch is up to date with ${SQ}upstream/main${SQ}.
+
-+ Your branch is up to date with ${SQ}origin/feature7${SQ}.
++ Your branch is up to date with ${SQ}origin/feature8${SQ}.
+ EOF
+ test_cmp expect actual
+'
+
-+test_expect_success 'status with upstream ahead and push branch up to date' '
++test_expect_success 'status.compareBranches with upstream behind and push up to date' '
+ (
+ cd test &&
+ git checkout -b ahead upstream/main &&
+ advance work &&
+ git push upstream HEAD &&
-+ git checkout -b feature8 upstream/main &&
++ git checkout -b feature9 upstream/main &&
+ git push origin &&
+ git branch --set-upstream-to upstream/ahead &&
+ git status >../actual
+ ) &&
+ cat >expect <<-EOF &&
-+ On branch feature8
++ On branch feature9
+ Your branch is behind ${SQ}upstream/ahead${SQ} by 1 commit, and can be fast-forwarded.
+ (use "git pull" to update your local branch)
+
-+ Your branch is up to date with ${SQ}origin/feature8${SQ}.
++ Your branch is up to date with ${SQ}origin/feature9${SQ}.
+
+ nothing to commit, working tree clean
+ EOF
+ test_cmp expect actual
+'
+
-+test_expect_success 'status shows remapped push refspec' '
++test_expect_success 'status.compareBranches with remapped push refspec' '
+ (
+ cd test &&
-+ git checkout -b feature9 origin/main &&
-+ git config remote.origin.push refs/heads/feature9:refs/heads/remapped &&
++ git checkout -b feature10 origin/main &&
++ git config remote.origin.push refs/heads/feature10:refs/heads/remapped &&
+ git push &&
+ advance work &&
+ git status >../actual
+ ) &&
+ cat >expect <<-EOF &&
-+ On branch feature9
++ On branch feature10
+ Your branch is ahead of ${SQ}origin/main${SQ} by 1 commit.
+
+ Your branch is ahead of ${SQ}origin/remapped${SQ} by 1 commit.
@@ t/t6040-tracking-info.sh: test_expect_success '--set-upstream-to @{-1}' '
+ test_cmp expect actual
+'
+
-+test_expect_success 'status shows remapped push refspec with upstream remote' '
++test_expect_success 'status.compareBranches with remapped push and upstream remote' '
+ (
+ cd test &&
-+ git checkout -b feature10 upstream/main &&
-+ git config remote.origin.push refs/heads/feature10:refs/heads/remapped &&
++ git checkout -b feature11 upstream/main &&
++ git config remote.origin.push refs/heads/feature11:refs/heads/remapped &&
+ git push origin &&
+ advance work &&
+ git status >../actual
+ ) &&
+ cat >expect <<-EOF &&
-+ On branch feature10
++ On branch feature11
+ Your branch is ahead of ${SQ}upstream/main${SQ} by 1 commit.
+
+ Your branch is ahead of ${SQ}origin/remapped${SQ} by 1 commit.
@@ t/t6040-tracking-info.sh: test_expect_success '--set-upstream-to @{-1}' '
+ EOF
+ test_cmp expect actual
+'
++
++test_expect_success 'clean up after compareBranches tests' '
++ (
++ cd test &&
++ git config --unset status.compareBranches
++ )
++'
+
test_done
--
gitgitgadget
next prev parent reply other threads:[~2026-01-18 19:59 UTC|newest]
Thread overview: 259+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-12-23 0:53 [PATCH] status: show default branch comparison when tracking non-default branch Harald Nordgren via GitGitGadget
2025-12-23 5:32 ` Junio C Hamano
2025-12-23 10:24 ` Harald Nordgren
2025-12-23 11:36 ` Harald Nordgren
2025-12-23 12:23 ` Chris Torek
2025-12-23 14:18 ` Harald Nordgren
2025-12-23 14:22 ` Chris Torek
2026-01-01 19:59 ` Another look? Harald Nordgren
2025-12-23 13:32 ` [PATCH] status: show default branch comparison when tracking non-default branch Junio C Hamano
2025-12-23 14:09 ` Harald Nordgren
2025-12-23 22:54 ` [PATCH v2 0/2] " Harald Nordgren via GitGitGadget
2025-12-23 22:54 ` [PATCH v2 1/2] status: show comparison with upstream default branch Harald Nordgren via GitGitGadget
2025-12-24 1:30 ` brian m. carlson
2025-12-24 1:46 ` Junio C Hamano
2026-01-01 20:01 ` Another look? Harald Nordgren
2025-12-23 22:54 ` [PATCH v2 2/2] Simplify default branch comparison logic Harald Nordgren via GitGitGadget
2025-12-24 0:00 ` [PATCH] status: show default branch comparison when tracking non-default branch Harald Nordgren
2025-12-24 9:31 ` [PATCH v3 0/3] " Harald Nordgren via GitGitGadget
2025-12-24 9:31 ` [PATCH v3 1/3] status: show comparison with upstream default branch Harald Nordgren via GitGitGadget
2025-12-24 9:31 ` [PATCH v3 2/3] Simplify default branch comparison logic Harald Nordgren via GitGitGadget
2025-12-24 9:31 ` [PATCH v3 3/3] Use repo.settings.statusGoalBranch config for status comparison Harald Nordgren via GitGitGadget
2025-12-24 10:19 ` [PATCH v4 0/4] status: show default branch comparison when tracking non-default branch Harald Nordgren via GitGitGadget
2025-12-24 10:19 ` [PATCH v4 1/4] status: show comparison with upstream default branch Harald Nordgren via GitGitGadget
2025-12-24 10:19 ` [PATCH v4 2/4] Simplify default branch comparison logic Harald Nordgren via GitGitGadget
2025-12-24 10:19 ` [PATCH v4 3/4] Use repo.settings.statusGoalBranch config for status comparison Harald Nordgren via GitGitGadget
2025-12-24 10:19 ` [PATCH v4 4/4] Rename default_remote to goal_branch Harald Nordgren via GitGitGadget
2025-12-24 10:38 ` [PATCH v5 0/5] status: show default branch comparison when tracking non-default branch Harald Nordgren via GitGitGadget
2025-12-24 10:38 ` [PATCH v5 1/5] status: show comparison with upstream default branch Harald Nordgren via GitGitGadget
2025-12-24 10:38 ` [PATCH v5 2/5] Simplify default branch comparison logic Harald Nordgren via GitGitGadget
2025-12-24 10:38 ` [PATCH v5 3/5] Use repo.settings.statusGoalBranch config for status comparison Harald Nordgren via GitGitGadget
2025-12-24 10:38 ` [PATCH v5 4/5] Rename default_remote to goal_branch Harald Nordgren via GitGitGadget
2025-12-24 10:38 ` [PATCH v5 5/5] Add warning for malformed statusGoalBranch config Harald Nordgren via GitGitGadget
2025-12-24 23:41 ` [PATCH v6 0/6] status: show default branch comparison when tracking non-default branch Harald Nordgren via GitGitGadget
2025-12-24 23:41 ` [PATCH v6 1/6] status: show comparison with upstream default branch Harald Nordgren via GitGitGadget
2025-12-24 23:41 ` [PATCH v6 2/6] Simplify default branch comparison logic Harald Nordgren via GitGitGadget
2025-12-24 23:41 ` [PATCH v6 3/6] Use repo.settings.statusGoalBranch config for status comparison Harald Nordgren via GitGitGadget
2025-12-24 23:41 ` [PATCH v6 4/6] Rename default_remote to goal_branch Harald Nordgren via GitGitGadget
2025-12-24 23:41 ` [PATCH v6 5/6] Add warning for malformed statusGoalBranch config Harald Nordgren via GitGitGadget
2025-12-24 23:41 ` [PATCH v6 6/6] Change config key to status.compareBranch Harald Nordgren via GitGitGadget
2025-12-25 8:00 ` [PATCH v6 0/6] status: show default branch comparison when tracking non-default branch Junio C Hamano
2025-12-25 9:45 ` [PATCH] " Harald Nordgren
2025-12-26 1:59 ` Junio C Hamano
2025-12-26 10:58 ` Harald Nordgren
2025-12-25 9:45 ` [PATCH v7] status: additional comparison with goal branch Harald Nordgren via GitGitGadget
2025-12-25 12:33 ` [PATCH v8] status: show comparison with configured " Harald Nordgren via GitGitGadget
2025-12-28 9:16 ` Code review? Harald Nordgren
2025-12-28 19:37 ` Junio C Hamano
2025-12-28 20:16 ` Harald Nordgren
2025-12-28 23:09 ` Ben Knoble
2025-12-29 12:17 ` Triangular workflows Harald Nordgren
2026-01-01 19:49 ` Code review? Harald Nordgren
2025-12-30 16:08 ` Harald Nordgren
2025-12-28 11:46 ` [PATCH v8] status: show comparison with configured goal branch Junio C Hamano
2025-12-28 15:46 ` Code review? Harald Nordgren
2025-12-28 15:41 ` [PATCH v9 0/2] status: show comparison with configured goal branch Harald Nordgren via GitGitGadget
2025-12-28 15:41 ` [PATCH v9 1/2] " Harald Nordgren via GitGitGadget
2025-12-28 15:41 ` [PATCH v9 2/2] improve tests Harald Nordgren via GitGitGadget
2025-12-30 16:08 ` [PATCH v10 0/3] status: show additional comparison with push branch when different from tracking branch Harald Nordgren via GitGitGadget
2025-12-30 16:08 ` [PATCH v10 1/3] status: show comparison with configured goal branch Harald Nordgren via GitGitGadget
2025-12-30 16:08 ` [PATCH v10 2/3] improve tests Harald Nordgren via GitGitGadget
2025-12-30 16:08 ` [PATCH v10 3/3] use pushRemote and tracking branch Harald Nordgren via GitGitGadget
2026-01-01 23:09 ` [PATCH v10 0/3] status: show additional comparison with push branch when different from " Junio C Hamano
2026-01-01 23:38 ` Another look? Harald Nordgren
2026-01-02 9:48 ` Kristoffer Haugsbakk
2026-01-02 11:20 ` Harald Nordgren
2026-01-12 7:34 ` Kristoffer Haugsbakk
2026-01-04 2:17 ` Junio C Hamano
2026-01-04 2:41 ` Nico Williams
2026-01-04 4:17 ` Junio C Hamano
2026-01-05 21:55 ` D. Ben Knoble
2026-01-02 11:17 ` [PATCH v11] status: show comparison with push remote tracking branch Harald Nordgren via GitGitGadget
2026-01-02 15:18 ` Phillip Wood
2026-01-02 20:27 ` Another look? Harald Nordgren
2026-01-03 10:04 ` Phillip Wood
2026-01-03 13:00 ` Harald Nordgren
2026-01-02 21:34 ` [PATCH v12 0/2] status: show comparison with push remote tracking branch Harald Nordgren via GitGitGadget
2026-01-02 21:34 ` [PATCH v12 1/2] refactor: format_branch_comparison in preparation Harald Nordgren via GitGitGadget
2026-01-02 21:34 ` [PATCH v12 2/2] status: show comparison with push remote tracking branch Harald Nordgren via GitGitGadget
2026-01-03 3:08 ` [PATCH v13 0/2] " Harald Nordgren via GitGitGadget
2026-01-03 3:08 ` [PATCH v13 1/2] refactor: format_branch_comparison in preparation Harald Nordgren via GitGitGadget
2026-01-03 3:08 ` [PATCH v13 2/2] status: show comparison with push remote tracking branch Harald Nordgren via GitGitGadget
2026-01-03 13:00 ` [PATCH v14 0/2] " Harald Nordgren via GitGitGadget
2026-01-03 13:00 ` [PATCH v14 1/2] refactor: format_branch_comparison in preparation Harald Nordgren via GitGitGadget
2026-01-04 4:40 ` Junio C Hamano
2026-01-04 10:27 ` Another look? Harald Nordgren
2026-01-04 10:48 ` Harald Nordgren
2026-01-05 1:16 ` Junio C Hamano
2026-01-03 13:00 ` [PATCH v14 2/2] status: show comparison with push remote tracking branch Harald Nordgren via GitGitGadget
2026-01-04 11:53 ` [PATCH v15 0/2] " Harald Nordgren via GitGitGadget
2026-01-04 11:53 ` [PATCH v15 1/2] refactor format_branch_comparison in preparation Harald Nordgren via GitGitGadget
2026-01-04 11:53 ` [PATCH v15 2/2] status: show comparison with push remote tracking branch Harald Nordgren via GitGitGadget
2026-01-04 23:21 ` [PATCH v16 0/2] " Harald Nordgren via GitGitGadget
2026-01-04 23:21 ` [PATCH v16 1/2] refactor format_branch_comparison in preparation Harald Nordgren via GitGitGadget
2026-01-05 2:05 ` Junio C Hamano
2026-01-05 9:15 ` Another look? Harald Nordgren
2026-01-05 9:46 ` Harald Nordgren
2026-01-05 12:28 ` Junio C Hamano
2026-01-05 13:16 ` Harald Nordgren
2026-01-05 22:13 ` Junio C Hamano
2026-01-06 0:08 ` ABQ Harald Nordgren
2026-01-08 10:19 ` ABQ Harald Nordgren
2026-01-04 23:21 ` [PATCH v16 2/2] status: show comparison with push remote tracking branch Harald Nordgren via GitGitGadget
2026-01-05 10:17 ` [PATCH v17 0/2] " Harald Nordgren via GitGitGadget
2026-01-05 10:17 ` [PATCH v17 1/2] refactor format_branch_comparison in preparation Harald Nordgren via GitGitGadget
2026-01-09 14:56 ` Phillip Wood
2026-01-09 15:23 ` Harald Nordgren
2026-01-05 10:17 ` [PATCH v17 2/2] status: show comparison with push remote tracking branch Harald Nordgren via GitGitGadget
2026-01-09 14:56 ` Phillip Wood
2026-01-09 16:00 ` [PATCH v17 1/2] refactor format_branch_comparison in preparation Harald Nordgren
2026-01-09 16:22 ` Ben Knoble
2026-01-09 16:32 ` Patrick Steinhardt
2026-01-09 18:03 ` Harald Nordgren
2026-01-12 14:45 ` Phillip Wood
2026-01-12 19:47 ` Harald Nordgren
2026-01-13 10:41 ` Phillip Wood
2026-01-13 12:11 ` Harald Nordgren
2026-01-09 16:41 ` [PATCH v18 0/2] status: show comparison with push remote tracking branch Harald Nordgren via GitGitGadget
2026-01-09 16:41 ` [PATCH v18 1/2] refactor format_branch_comparison in preparation Harald Nordgren via GitGitGadget
2026-01-09 16:41 ` [PATCH v18 2/2] status: show comparison with push remote tracking branch Harald Nordgren via GitGitGadget
2026-01-09 18:40 ` [PATCH v19 0/2] " Harald Nordgren via GitGitGadget
2026-01-09 18:40 ` [PATCH v19 1/2] refactor format_branch_comparison in preparation Harald Nordgren via GitGitGadget
2026-01-10 2:02 ` Junio C Hamano
2026-01-09 18:40 ` [PATCH v19 2/2] status: show comparison with push remote tracking branch Harald Nordgren via GitGitGadget
2026-01-10 2:13 ` Junio C Hamano
2026-01-10 11:14 ` [PATCH v17 1/2] refactor format_branch_comparison in preparation Harald Nordgren
2026-01-10 17:34 ` Junio C Hamano
2026-01-10 2:21 ` [PATCH v19 2/2] status: show comparison with push remote tracking branch Junio C Hamano
2026-01-10 11:06 ` [PATCH v17 1/2] refactor format_branch_comparison in preparation Harald Nordgren
2026-01-10 14:44 ` Harald Nordgren
2026-01-10 17:31 ` Junio C Hamano
2026-01-10 20:04 ` Harald Nordgren
2026-01-11 3:39 ` Junio C Hamano
2026-01-10 13:30 ` [PATCH v20 0/2] status: show comparison with push remote tracking branch Harald Nordgren via GitGitGadget
2026-01-10 13:30 ` [PATCH v20 1/2] refactor format_branch_comparison in preparation Harald Nordgren via GitGitGadget
2026-01-10 13:30 ` [PATCH v20 2/2] status: show comparison with push remote tracking branch Harald Nordgren via GitGitGadget
2026-01-10 15:24 ` [PATCH v21 0/2] " Harald Nordgren via GitGitGadget
2026-01-10 15:24 ` [PATCH v21 1/2] refactor format_branch_comparison in preparation Harald Nordgren via GitGitGadget
2026-01-10 15:24 ` [PATCH v21 2/2] status: show comparison with push remote tracking branch Harald Nordgren via GitGitGadget
2026-01-10 19:56 ` [PATCH v22 0/2] " Harald Nordgren via GitGitGadget
2026-01-10 19:56 ` [PATCH v22 1/2] refactor format_branch_comparison in preparation Harald Nordgren via GitGitGadget
2026-01-10 19:56 ` [PATCH v22 2/2] status: show comparison with push remote tracking branch Harald Nordgren via GitGitGadget
2026-01-12 20:26 ` [PATCH v23 0/2] " Harald Nordgren via GitGitGadget
2026-01-12 20:26 ` [PATCH v23 1/2] refactor format_branch_comparison in preparation Harald Nordgren via GitGitGadget
2026-01-12 20:26 ` [PATCH v23 2/2] status: show comparison with push remote tracking branch Harald Nordgren via GitGitGadget
2026-01-12 20:46 ` Junio C Hamano
2026-01-13 9:54 ` [PATCH v17 1/2] refactor format_branch_comparison in preparation Harald Nordgren
2026-01-13 9:55 ` [PATCH v24 0/2] status: show comparison with push remote tracking branch Harald Nordgren via GitGitGadget
2026-01-13 9:55 ` [PATCH v24 1/2] refactor format_branch_comparison in preparation Harald Nordgren via GitGitGadget
2026-01-13 9:55 ` [PATCH v24 2/2] status: show comparison with push remote tracking branch Harald Nordgren via GitGitGadget
2026-01-13 12:11 ` [PATCH v25 0/2] " Harald Nordgren via GitGitGadget
2026-01-13 12:11 ` [PATCH v25 1/2] refactor format_branch_comparison in preparation Harald Nordgren via GitGitGadget
2026-01-13 12:11 ` [PATCH v25 2/2] status: show comparison with push remote tracking branch Harald Nordgren via GitGitGadget
2026-01-13 17:03 ` Jeff King
2026-01-13 18:35 ` Triangular workflow Harald Nordgren
2026-01-13 21:40 ` Jeff King
2026-01-13 23:01 ` Harald Nordgren
2026-01-14 2:22 ` D. Ben Knoble
2026-01-14 7:59 ` Harald Nordgren
2026-01-14 21:38 ` Ben Knoble
2026-01-14 2:34 ` Jeff King
2026-01-14 7:53 ` Harald Nordgren
2026-01-14 16:24 ` Jeff King
2026-01-14 17:48 ` Harald Nordgren
2026-01-14 21:01 ` Jeff King
2026-01-14 21:38 ` Ben Knoble
2026-01-14 22:17 ` Jeff King
2026-01-15 16:17 ` D. Ben Knoble
2026-01-14 14:15 ` Junio C Hamano
2026-01-14 18:54 ` Junio C Hamano
2026-01-14 21:10 ` Jeff King
2026-01-14 21:38 ` Ben Knoble
2026-01-14 23:08 ` Harald Nordgren
2026-01-19 5:58 ` Chris Torek
2026-01-20 8:35 ` Harald Nordgren
2026-01-14 23:12 ` Harald Nordgren
2026-01-14 23:31 ` Junio C Hamano
2026-01-18 19:58 ` Harald Nordgren
2026-01-15 10:31 ` [PATCH v25 2/2] status: show comparison with push remote tracking branch Phillip Wood
2026-01-15 13:38 ` Junio C Hamano
2026-01-15 19:53 ` Jeff King
2026-01-18 19:59 ` Harald Nordgren via GitGitGadget [this message]
2026-01-18 19:59 ` [PATCH v26 1/2] refactor format_branch_comparison in preparation Harald Nordgren via GitGitGadget
2026-01-18 19:59 ` [PATCH v26 2/2] status: add status.compareBranches config for multiple branch comparisons Harald Nordgren via GitGitGadget
2026-01-19 5:14 ` Jeff King
2026-01-20 9:49 ` Memory leak Harald Nordgren
2026-01-20 13:22 ` Harald Nordgren
2026-01-20 21:42 ` Junio C Hamano
2026-01-21 18:47 ` Junio C Hamano
2026-01-21 20:49 ` Jeff King
2026-01-22 15:03 ` Harald Nordgren
2026-01-22 18:19 ` Junio C Hamano
2026-01-22 15:37 ` [PATCH v27 0/2] status: add status.compareBranches config for multiple branch comparisons Harald Nordgren via GitGitGadget
2026-01-22 15:37 ` [PATCH v27 1/2] refactor format_branch_comparison in preparation Harald Nordgren via GitGitGadget
2026-01-22 15:37 ` [PATCH v27 2/2] status: add status.compareBranches config for multiple branch comparisons Harald Nordgren via GitGitGadget
2026-01-22 19:07 ` Jeff King
2026-01-22 19:22 ` [PATCH v27 0/2] " Harald Nordgren
2026-01-22 20:18 ` Junio C Hamano
2026-01-22 20:37 ` [PATCH v27 2/2] " Junio C Hamano
2026-01-22 20:56 ` Harald Nordgren
2026-01-22 21:11 ` Junio C Hamano
2026-01-22 21:36 ` Junio C Hamano
2026-01-22 22:01 ` Jeff King
2026-01-22 22:44 ` Jeff King
2026-01-22 23:06 ` Jeff King
2026-01-24 8:50 ` Harald Nordgren
2026-01-25 17:29 ` Junio C Hamano
2026-02-08 13:33 ` Harald Nordgren
2026-01-22 23:14 ` Junio C Hamano
2026-01-22 18:53 ` [PATCH v27 0/2] " Junio C Hamano
2026-01-22 19:09 ` Harald Nordgren
2026-01-22 19:20 ` Junio C Hamano
2026-01-22 19:24 ` Harald Nordgren
2026-01-22 20:07 ` [PATCH v28 " Harald Nordgren via GitGitGadget
2026-01-22 20:07 ` [PATCH v28 1/2] refactor format_branch_comparison in preparation Harald Nordgren via GitGitGadget
2026-01-22 20:07 ` [PATCH v28 2/2] status: add status.compareBranches config for multiple branch comparisons Harald Nordgren via GitGitGadget
2026-02-21 8:02 ` Harald Nordgren
2026-02-21 17:17 ` Junio C Hamano
2026-02-22 14:50 ` D. Ben Knoble
2026-02-23 13:30 ` Jeff King
2026-02-24 19:36 ` Harald Nordgren
2026-02-24 22:21 ` Junio C Hamano
2026-02-25 10:22 ` Harald Nordgren
2026-02-25 15:44 ` Junio C Hamano
2026-02-25 16:08 ` Jeff King
2026-02-25 16:52 ` Junio C Hamano
2026-02-26 13:50 ` Harald Nordgren
2026-02-25 17:04 ` D. Ben Knoble
2026-02-25 21:51 ` [PATCH v29 0/2] " Harald Nordgren via GitGitGadget
2026-02-25 21:51 ` [PATCH v29 1/2] refactor format_branch_comparison in preparation Harald Nordgren via GitGitGadget
2026-02-25 21:51 ` [PATCH v29 2/2] status: add status.compareBranches config for multiple branch comparisons Harald Nordgren via GitGitGadget
2026-02-25 23:18 ` Junio C Hamano
2026-02-26 13:47 ` Harald Nordgren
2026-02-26 10:33 ` [PATCH v30 0/2] " Harald Nordgren via GitGitGadget
2026-02-26 10:33 ` [PATCH v30 1/2] refactor format_branch_comparison in preparation Harald Nordgren via GitGitGadget
2026-02-26 10:33 ` [PATCH v30 2/2] status: add status.compareBranches config for multiple branch comparisons Harald Nordgren via GitGitGadget
2026-03-02 23:52 ` Junio C Hamano
2026-03-04 10:30 ` [PATCH v30 0/2] " Harald Nordgren
2026-02-26 15:28 ` Junio C Hamano
2026-03-01 19:06 ` Harald Nordgren
2026-03-01 19:25 ` Kristoffer Haugsbakk
2026-03-02 16:52 ` Junio C Hamano
2026-03-04 12:25 ` [PATCH v31 " Harald Nordgren via GitGitGadget
2026-03-04 12:25 ` [PATCH v31 1/2] refactor format_branch_comparison in preparation Harald Nordgren via GitGitGadget
2026-03-04 12:25 ` [PATCH v31 2/2] status: add status.compareBranches config for multiple branch comparisons Harald Nordgren via GitGitGadget
2026-03-04 17:05 ` [PATCH v31 0/2] " Junio C Hamano
2026-03-09 9:20 ` Harald Nordgren
2026-03-09 15:10 ` Junio C Hamano
2026-01-10 17:41 ` [PATCH v20 0/2] status: show comparison with push remote tracking branch Junio C Hamano
2026-01-10 19:06 ` Harald Nordgren
2026-01-12 7:33 ` Kristoffer Haugsbakk
2025-12-23 23:11 ` [PATCH] status: show default branch comparison when tracking non-default branch Yee Cheng Chin
2025-12-23 23:59 ` Harald Nordgren
2025-12-24 0:55 ` Yee Cheng Chin
2025-12-24 0:38 ` Junio C Hamano
2025-12-24 0:49 ` Yee Cheng Chin
2025-12-24 1:44 ` Junio C Hamano
2025-12-24 10:24 ` Harald Nordgren
2026-01-01 20:05 ` Another look? Harald Nordgren
2025-12-24 1:12 ` [PATCH] status: show default branch comparison when tracking non-default branch Harald Nordgren
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.2138.v26.git.git.1768766353.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=git@vger.kernel.org \
--cc=haraldnordgren@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.