From: "Harald Nordgren via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Harald Nordgren <haraldnordgren@gmail.com>,
Harald Nordgren <haraldnordgren@gmail.com>
Subject: [PATCH v31 2/2] status: add status.compareBranches config for multiple branch comparisons
Date: Wed, 04 Mar 2026 12:25:31 +0000 [thread overview]
Message-ID: <f07ccb278c171e7350ade1501a8cf7c8ec79046a.1772627131.git.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.2138.v31.git.git.1772627131.gitgitgadget@gmail.com>
From: Harald Nordgren <haraldnordgren@gmail.com>
Add a new configuration variable status.compareBranches that allows
users to specify a space-separated list of branch comparisons in
git status output.
Supported values:
- @{upstream} for the current branch's upstream tracking branch
- @{push} for the current branch's push destination
Any other value is ignored and a warning is shown.
When not configured, the default behavior is equivalent to setting
`status.compareBranches = @{upstream}`, preserving backward
compatibility.
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
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.
Example configuration:
[status]
compareBranches = @{upstream} @{push}
Signed-off-by: Harald Nordgren <haraldnordgren@gmail.com>
---
Documentation/config/status.adoc | 25 +++
remote.c | 146 ++++++++++---
t/t6040-tracking-info.sh | 354 +++++++++++++++++++++++++++++++
3 files changed, 497 insertions(+), 28 deletions(-)
diff --git a/Documentation/config/status.adoc b/Documentation/config/status.adoc
index 8caf90f51c..b5dd85b761 100644
--- a/Documentation/config/status.adoc
+++ b/Documentation/config/status.adoc
@@ -17,6 +17,31 @@ 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 branch comparison specifiers to use in
+ linkgit:git-status[1]. Currently, only `@{upstream}` and `@{push}`
+ are supported. They are interpreted as `branch@{upstream}` and
+ `branch@{push}` for the current branch.
++
+If not set, the default behavior is equivalent to `@{upstream}`, which
+compares against the configured upstream tracking branch.
++
+The entries are shown in the order they appear in the configuration.
+Duplicate entries that resolve to the same ref are suppressed after
+their first occurrence, so `@{push} @{upstream} @{push}` shows at
+most two comparisons. When `@{upstream}` and `@{push}` resolve to
+the same remote-tracking branch, only one comparison is shown.
++
+Example:
++
+----
+[status]
+ compareBranches = @{upstream} @{push}
+----
++
+This would show comparisons against both the configured upstream and push
+tracking branches for the current branch.
+
status.displayCommentPrefix::
If set to true, linkgit:git-status[1] will insert a comment
prefix before each output line (starting with
diff --git a/remote.c b/remote.c
index e9e2f56ed6..7ca2a6501b 100644
--- a/remote.c
+++ b/remote.c
@@ -29,6 +29,12 @@
enum map_direction { FROM_SRC, FROM_DST };
+enum {
+ ENABLE_ADVICE_PULL = (1 << 0),
+ ENABLE_ADVICE_PUSH = (1 << 1),
+ ENABLE_ADVICE_DIVERGENCE = (1 << 2),
+};
+
struct counted_string {
size_t len;
const char *s;
@@ -2234,13 +2240,40 @@ 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 *resolve_compare_branch(struct branch *branch, const char *name)
+{
+ const char *resolved = NULL;
+
+ if (!branch || !name)
+ return NULL;
+
+ if (!strcasecmp(name, "@{upstream}")) {
+ resolved = branch_get_upstream(branch, NULL);
+ } else if (!strcasecmp(name, "@{push}")) {
+ resolved = branch_get_push(branch, NULL);
+ } else {
+ warning(_("ignoring value '%s' for status.compareBranches, "
+ "only @{upstream} and @{push} are supported"),
+ name);
+ return NULL;
+ }
+
+ if (resolved)
+ return xstrdup(resolved);
+ return NULL;
+}
+
static void format_branch_comparison(struct strbuf *sb,
bool up_to_date,
int ours, int theirs,
const char *branch_name,
enum ahead_behind_flags abf,
- bool show_divergence_advice)
+ unsigned flags)
{
+ bool use_push_advice = (flags & ENABLE_ADVICE_PUSH);
+ bool use_pull_advice = (flags & ENABLE_ADVICE_PULL);
+ bool use_divergence_advice = (flags & ENABLE_ADVICE_DIVERGENCE);
+
if (up_to_date) {
strbuf_addf(sb,
_("Your branch is up to date with '%s'.\n"),
@@ -2249,7 +2282,7 @@ static void format_branch_comparison(struct strbuf *sb,
strbuf_addf(sb,
_("Your branch and '%s' refer to different commits.\n"),
branch_name);
- if (advice_enabled(ADVICE_STATUS_HINTS))
+ if (use_push_advice && advice_enabled(ADVICE_STATUS_HINTS))
strbuf_addf(sb, _(" (use \"%s\" for details)\n"),
"git status --ahead-behind");
} else if (!theirs) {
@@ -2258,7 +2291,7 @@ static void format_branch_comparison(struct strbuf *sb,
"Your branch is ahead of '%s' by %d commits.\n",
ours),
branch_name, ours);
- if (advice_enabled(ADVICE_STATUS_HINTS))
+ if (use_push_advice && advice_enabled(ADVICE_STATUS_HINTS))
strbuf_addstr(sb,
_(" (use \"git push\" to publish your local commits)\n"));
} else if (!ours) {
@@ -2269,7 +2302,7 @@ static void format_branch_comparison(struct strbuf *sb,
"and can be fast-forwarded.\n",
theirs),
branch_name, theirs);
- if (advice_enabled(ADVICE_STATUS_HINTS))
+ if (use_pull_advice && advice_enabled(ADVICE_STATUS_HINTS))
strbuf_addstr(sb,
_(" (use \"git pull\" to update your local branch)\n"));
} else {
@@ -2282,8 +2315,7 @@ static void format_branch_comparison(struct strbuf *sb,
"respectively.\n",
ours + theirs),
branch_name, ours, theirs);
- if (show_divergence_advice &&
- advice_enabled(ADVICE_STATUS_HINTS))
+ if (use_divergence_advice && advice_enabled(ADVICE_STATUS_HINTS))
strbuf_addstr(sb,
_(" (use \"git pull\" if you want to integrate the remote branch with yours)\n"));
}
@@ -2296,34 +2328,92 @@ int format_tracking_info(struct branch *branch, struct strbuf *sb,
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;
+ char *compare_branches = NULL;
+ struct string_list branches = STRING_LIST_INIT_DUP;
+ struct strset processed_refs = STRSET_INIT;
+ int reported = 0;
+ size_t i;
+ const char *upstream_ref;
+ const char *push_ref;
- 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;
+ repo_config_get_string(the_repository, "status.comparebranches",
+ &compare_branches);
+
+ if (compare_branches) {
+ string_list_split(&branches, compare_branches, " ", -1);
+ string_list_remove_empty_items(&branches, 0);
+ } else {
+ string_list_append(&branches, "@{upstream}");
}
- 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);
- 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 < branches.nr; i++) {
+ char *full_ref;
+ char *short_ref;
+ int ours, theirs, cmp;
+ int is_upstream, is_push;
+ unsigned flags = 0;
+
+ full_ref = resolve_compare_branch(branch,
+ branches.items[i].string);
+ if (!full_ref)
+ continue;
+
+ if (!strset_add(&processed_refs, full_ref)) {
+ free(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 (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);
- return 1;
+ string_list_clear(&branches, 0);
+ strset_clear(&processed_refs);
+ free(compare_branches);
+ return reported;
}
static int one_local_ref(const struct reference *ref, void *cb_data)
diff --git a/t/t6040-tracking-info.sh b/t/t6040-tracking-info.sh
index 0b719bbae6..0242b5bf7a 100755
--- a/t/t6040-tracking-info.sh
+++ b/t/t6040-tracking-info.sh
@@ -292,4 +292,358 @@ test_expect_success '--set-upstream-to @{-1}' '
test_cmp expect actual
'
+test_expect_success 'status tracking origin/main shows only main' '
+ git -C test checkout b4 &&
+ git -C test status >actual &&
+ cat >expect <<-EOF &&
+ On branch b4
+ Your branch is ahead of ${SQ}origin/main${SQ} by 2 commits.
+ (use "git push" to publish your local commits)
+
+ nothing to commit, working tree clean
+ EOF
+ test_cmp expect actual
+'
+
+test_expect_success 'status --no-ahead-behind tracking origin/main shows only main' '
+ git -C test checkout b4 &&
+ git -C test status --no-ahead-behind >actual &&
+ cat >expect <<-EOF &&
+ On branch b4
+ Your branch and ${SQ}origin/main${SQ} refer to different commits.
+ (use "git status --ahead-behind" for details)
+
+ nothing to commit, working tree clean
+ EOF
+ test_cmp expect actual
+'
+
+test_expect_success 'status.compareBranches deduplicates when upstream and push are the same' '
+ test_config -C test status.compareBranches "@{upstream} @{push}" &&
+ git -C test checkout main &&
+ git -C test status >actual &&
+ cat >expect <<-EOF &&
+ On branch main
+ Your branch is up to date with ${SQ}origin/main${SQ}.
+
+ nothing to commit, working tree clean
+ EOF
+ test_cmp expect actual
+'
+
+test_expect_success 'status.compareBranches with only upstream shows only upstream' '
+ test_config -C test status.compareBranches "@{upstream}" &&
+ git -C test checkout main &&
+ git -C test status >actual &&
+ cat >expect <<-EOF &&
+ On branch main
+ Your branch is up to date with ${SQ}origin/main${SQ}.
+
+ nothing to commit, working tree clean
+ EOF
+ test_cmp expect actual
+'
+
+test_expect_success 'status.compareBranches with only push shows only push' '
+ test_config -C test push.default current &&
+ test_config -C test status.compareBranches "@{push}" &&
+ git -C test checkout -b feature2 origin/main &&
+ git -C test push origin HEAD &&
+ (cd test && advance work) &&
+ git -C test status >actual &&
+ cat >expect <<-EOF &&
+ On branch feature2
+ Your branch is ahead of ${SQ}origin/feature2${SQ} by 1 commit.
+ (use "git push" to publish your local commits)
+
+ nothing to commit, working tree clean
+ EOF
+ test_cmp expect actual
+'
+
+test_expect_success 'status.compareBranches shows ahead of both upstream and push branch' '
+ test_config -C test push.default current &&
+ test_config -C test status.compareBranches "@{upstream} @{push}" &&
+ git -C test checkout -b feature3 origin/main &&
+ git -C test push origin HEAD &&
+ (cd test && advance work) &&
+ git -C test status >actual &&
+ cat >expect <<-EOF &&
+ On branch feature3
+ Your branch is ahead of ${SQ}origin/main${SQ} by 1 commit.
+
+ Your branch is ahead of ${SQ}origin/feature3${SQ} by 1 commit.
+ (use "git push" to publish your local commits)
+
+ nothing to commit, working tree clean
+ EOF
+ test_cmp expect actual
+'
+
+test_expect_success 'checkout with status.compareBranches shows both branches' '
+ test_config -C test push.default current &&
+ test_config -C test status.compareBranches "@{upstream} @{push}" &&
+ git -C test checkout feature3 >actual &&
+ cat >expect <<-EOF &&
+ Your branch is ahead of ${SQ}origin/main${SQ} by 1 commit.
+
+ Your branch is ahead of ${SQ}origin/feature3${SQ} by 1 commit.
+ (use "git push" to publish your local commits)
+ EOF
+ test_cmp expect actual
+'
+
+test_expect_success 'setup for ahead of tracked but diverged from main' '
+ (
+ cd test &&
+ git checkout -b feature4 origin/main &&
+ advance work1 &&
+ git checkout origin/main &&
+ advance work2 &&
+ git push origin HEAD:main &&
+ git checkout feature4 &&
+ advance work3
+ )
+'
+
+test_expect_success 'status.compareBranches shows diverged and ahead' '
+ test_config -C test push.default current &&
+ test_config -C test status.compareBranches "@{upstream} @{push}" &&
+ git -C test checkout feature4 &&
+ git -C test branch --set-upstream-to origin/main &&
+ git -C test push origin HEAD &&
+ (cd test && advance work) &&
+ git -C test status >actual &&
+ cat >expect <<-EOF &&
+ On branch feature4
+ Your branch and ${SQ}origin/main${SQ} have diverged,
+ and have 3 and 1 different commits each, respectively.
+ (use "git pull" if you want to integrate the remote branch with yours)
+
+ Your branch is ahead of ${SQ}origin/feature4${SQ} by 1 commit.
+ (use "git push" to publish your local commits)
+
+ nothing to commit, working tree clean
+ EOF
+ test_cmp expect actual
+'
+
+test_expect_success 'status --no-ahead-behind with status.compareBranches' '
+ test_config -C test push.default current &&
+ test_config -C test status.compareBranches "@{upstream} @{push}" &&
+ git -C test checkout feature4 &&
+ git -C test status --no-ahead-behind >actual &&
+ cat >expect <<-EOF &&
+ On branch feature4
+ Your branch and ${SQ}origin/main${SQ} refer to different commits.
+
+ Your branch and ${SQ}origin/feature4${SQ} refer to different commits.
+ (use "git status --ahead-behind" for details)
+
+ nothing to commit, working tree clean
+ EOF
+ test_cmp expect actual
+'
+
+test_expect_success 'setup upstream remote' '
+ (
+ cd test &&
+ git remote add upstream ../. &&
+ git fetch upstream
+ )
+'
+
+test_expect_success 'status.compareBranches with upstream and origin remotes' '
+ test_config -C test push.default current &&
+ test_config -C test remote.pushDefault origin &&
+ test_config -C test status.compareBranches "@{upstream} @{push}" &&
+ git -C test checkout -b feature5 upstream/main &&
+ git -C test push origin &&
+ (cd test && advance work) &&
+ git -C test status >actual &&
+ cat >expect <<-EOF &&
+ On branch feature5
+ Your branch is ahead of ${SQ}upstream/main${SQ} by 1 commit.
+
+ Your branch is ahead of ${SQ}origin/feature5${SQ} by 1 commit.
+ (use "git push" to publish your local commits)
+
+ nothing to commit, working tree clean
+ EOF
+ test_cmp expect actual
+'
+
+test_expect_success 'status.compareBranches supports ordered upstream/push entries' '
+ test_config -C test push.default current &&
+ test_config -C test remote.pushDefault origin &&
+ test_config -C test status.compareBranches "@{push} @{upstream}" &&
+ git -C test checkout -b feature6 upstream/main &&
+ git -C test push origin &&
+ (cd test && advance work) &&
+ git -C test status >actual &&
+ cat >expect <<-EOF &&
+ On branch feature6
+ 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}upstream/main${SQ} by 1 commit.
+
+ nothing to commit, working tree clean
+ EOF
+ test_cmp expect actual
+'
+
+test_expect_success 'status.compareBranches deduplicates repeated specifiers' '
+ test_config -C test push.default current &&
+ test_config -C test remote.pushDefault origin &&
+ test_config -C test status.compareBranches "@{push} @{upstream} @{push}" &&
+ git -C test checkout -b feature7 upstream/main &&
+ git -C test push origin &&
+ (cd test && advance work) &&
+ git -C test status >actual &&
+ cat >expect <<-EOF &&
+ On branch feature7
+ Your branch is ahead of ${SQ}origin/feature7${SQ} by 1 commit.
+ (use "git push" to publish your local commits)
+
+ Your branch is ahead of ${SQ}upstream/main${SQ} by 1 commit.
+
+ nothing to commit, working tree clean
+ EOF
+ test_cmp expect actual
+'
+
+test_expect_success 'status.compareBranches with diverged push branch' '
+ test_config -C test push.default current &&
+ test_config -C test remote.pushDefault origin &&
+ test_config -C test status.compareBranches "@{upstream} @{push}" &&
+ git -C test checkout -b feature8 upstream/main &&
+ (cd test && advance work81) &&
+ git -C test push origin &&
+ git -C test reset --hard upstream/main &&
+ (cd test && advance work82) &&
+ git -C test status >actual &&
+ cat >expect <<-EOF &&
+ On branch feature8
+ Your branch is ahead of ${SQ}upstream/main${SQ} by 1 commit.
+
+ Your branch and ${SQ}origin/feature8${SQ} have diverged,
+ and have 1 and 1 different commits each, respectively.
+
+ nothing to commit, working tree clean
+ EOF
+ test_cmp expect actual
+'
+
+test_expect_success 'status.compareBranches shows up to date branches' '
+ test_config -C test push.default current &&
+ test_config -C test remote.pushDefault origin &&
+ test_config -C test status.compareBranches "@{upstream} @{push}" &&
+ git -C test checkout -b feature9 upstream/main &&
+ git -C test push origin &&
+ git -C test status >actual &&
+ cat >expect <<-EOF &&
+ On branch feature9
+ Your branch is up to date with ${SQ}upstream/main${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 --no-ahead-behind with status.compareBranches up to date' '
+ test_config -C test push.default current &&
+ test_config -C test remote.pushDefault origin &&
+ test_config -C test status.compareBranches "@{upstream} @{push}" &&
+ git -C test checkout feature9 >actual &&
+ git -C test push origin &&
+ git -C test status --no-ahead-behind >actual &&
+ cat >expect <<-EOF &&
+ On branch feature9
+ Your branch is up to date with ${SQ}upstream/main${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 'checkout with status.compareBranches shows up to date' '
+ test_config -C test push.default current &&
+ test_config -C test remote.pushDefault origin &&
+ test_config -C test status.compareBranches "@{upstream} @{push}" &&
+ git -C test checkout feature9 >actual &&
+ cat >expect <<-EOF &&
+ Your branch is up to date with ${SQ}upstream/main${SQ}.
+
+ Your branch is up to date with ${SQ}origin/feature9${SQ}.
+ EOF
+ test_cmp expect actual
+'
+
+test_expect_success 'status.compareBranches with upstream behind and push up to date' '
+ test_config -C test push.default current &&
+ test_config -C test remote.pushDefault origin &&
+ test_config -C test status.compareBranches "@{upstream} @{push}" &&
+ git -C test checkout -b ahead upstream/main &&
+ (cd test && advance work) &&
+ git -C test push upstream HEAD &&
+ git -C test checkout -b feature10 upstream/main &&
+ git -C test push origin &&
+ git -C test branch --set-upstream-to upstream/ahead &&
+ git -C test status >actual &&
+ cat >expect <<-EOF &&
+ On branch feature10
+ 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/feature10${SQ}.
+
+ nothing to commit, working tree clean
+ EOF
+ test_cmp expect actual
+'
+
+test_expect_success 'status.compareBranches with remapped push refspec' '
+ test_config -C test remote.origin.push refs/heads/feature11:refs/heads/remapped &&
+ test_config -C test status.compareBranches "@{upstream} @{push}" &&
+ git -C test checkout -b feature11 origin/main &&
+ git -C test push &&
+ (cd test && advance work) &&
+ git -C test status >actual &&
+ cat >expect <<-EOF &&
+ On branch feature11
+ Your branch is ahead of ${SQ}origin/main${SQ} by 1 commit.
+
+ Your branch is ahead of ${SQ}origin/remapped${SQ} by 1 commit.
+ (use "git push" to publish your local commits)
+
+ nothing to commit, working tree clean
+ EOF
+ test_cmp expect actual
+'
+
+test_expect_success 'status.compareBranches with remapped push and upstream remote' '
+ test_config -C test remote.pushDefault origin &&
+ test_config -C test remote.origin.push refs/heads/feature12:refs/heads/remapped &&
+ test_config -C test status.compareBranches "@{upstream} @{push}" &&
+ git -C test checkout -b feature12 upstream/main &&
+ git -C test push origin &&
+ (cd test && advance work) &&
+ git -C test status >actual &&
+ cat >expect <<-EOF &&
+ On branch feature12
+ Your branch is ahead of ${SQ}upstream/main${SQ} by 1 commit.
+
+ Your branch is ahead of ${SQ}origin/remapped${SQ} by 1 commit.
+ (use "git push" to publish your local commits)
+
+ nothing to commit, working tree clean
+ EOF
+ test_cmp expect actual
+'
+
test_done
--
gitgitgadget
next prev parent reply other threads:[~2026-03-04 12:25 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 ` [PATCH v26 0/2] status: add status.compareBranches config for multiple branch comparisons Harald Nordgren via GitGitGadget
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 ` Harald Nordgren via GitGitGadget [this message]
2026-03-04 17:05 ` [PATCH v31 0/2] status: add status.compareBranches config for multiple branch comparisons 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=f07ccb278c171e7350ade1501a8cf7c8ec79046a.1772627131.git.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox