git/list[1] front-page[2] threads[3] people[4] search[5] about
wed 2026-10-07 17:18 UTC

[PATCH v27 2/2] status: add status.compareBranches config for multiple branch comparisons

From
Harald Nordgren via GitGitGadget <gitgitgadget@gmail.com>
Date
Jan 22, 2026, 15:37 UTC
Message-ID
<0993420fc1185ec4a907a8c3bb52ca965e720c54.1769096240.git.gitgitgadget@gmail.com>
In-Reply-To
<pull.2138.v27.git.git.1769096240.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 branches to compare against the current branch in `git status` output.

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 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 |  20 ++
 remote.c                         | 160 ++++++++++++---
 t/t6040-tracking-info.sh         | 337 +++++++++++++++++++++++++++++++
 3 files changed, 489 insertions(+), 28 deletions(-)
diff --git a/Documentation/config/status.adoc b/Documentation/config/status.adoc
index 8caf90f51c..ab54f25fbc 100644
--- a/Documentation/config/status.adoc
+++ b/Documentation/config/status.adoc
@@ -17,6 +17,26 @@ 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
diff --git a/remote.c b/remote.c
index fd592ec659..e256cc9b81 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;
@@ -2230,13 +2236,53 @@ 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)
+{
+	struct strbuf buf = STRBUF_INIT;
+	const char *resolved = NULL;
+	char *ret;
+
+	if (!branch || !name)
+		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);
+
+	if (resolved)
+		return xstrdup(resolved);
+
+	strbuf_addf(&buf, "refs/remotes/%s", name);
+	resolved = refs_resolve_ref_unsafe(
+		get_main_ref_store(the_repository),
+		buf.buf,
+		RESOLVE_REF_READING,
+		NULL, NULL);
+	if (resolved) {
+		ret = xstrdup(resolved);
+		strbuf_release(&buf);
+		return ret;
+	}
+
+	strbuf_release(&buf);
+	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 enable_push_advice = (flags & ENABLE_ADVICE_PUSH) &&
+		advice_enabled(ADVICE_STATUS_HINTS);
+	bool enable_pull_advice = (flags & ENABLE_ADVICE_PULL) &&
+		advice_enabled(ADVICE_STATUS_HINTS);
+	bool enable_divergence_advice = (flags & ENABLE_ADVICE_DIVERGENCE) &&
+		advice_enabled(ADVICE_STATUS_HINTS);
+
 	if (up_to_date) {
 		strbuf_addf(sb,
 			_("Your branch is up to date with '%s'.\n"),
@@ -2245,7 +2291,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 (enable_push_advice)
 			strbuf_addf(sb, _("  (use \"%s\" for details)\n"),
 				    "git status --ahead-behind");
 	} else if (!theirs) {
@@ -2254,7 +2300,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 (enable_push_advice)
 			strbuf_addstr(sb,
 				_("  (use \"git push\" to publish your local commits)\n"));
 	} else if (!ours) {
@@ -2265,7 +2311,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 (enable_pull_advice)
 			strbuf_addstr(sb,
 				_("  (use \"git pull\" to update your local branch)\n"));
 	} else {
@@ -2278,8 +2324,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 (enable_divergence_advice)
 			strbuf_addstr(sb,
 				_("  (use \"git pull\" if you want to integrate the remote branch with yours)\n"));
 	}
@@ -2292,34 +2337,93 @@ 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 string_list processed_refs = STRING_LIST_INIT_DUP;
+	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 (string_list_has_string(&processed_refs, full_ref)) {
+			free(full_ref);
+			continue;
+		}
+		string_list_insert(&processed_refs, full_ref);
+
+		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);
+	string_list_clear(&processed_refs, 0);
+	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..f7859d2e5a 100755
--- a/t/t6040-tracking-info.sh
+++ b/t/t6040-tracking-info.sh
@@ -292,4 +292,341 @@ test_expect_success '--set-upstream-to @{-1}' '
 	test_cmp expect actual
 '
 
+test_expect_success 'status tracking origin/main shows only main' '
+	(
+		cd test &&
+		git checkout b4 &&
+		git 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' '
+	(
+		cd test &&
+		git checkout b4 &&
+		git 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 'setup for compareBranches tests' '
+	(
+		cd test &&
+		git config push.default current &&
+		git config status.compareBranches "@{upstream} @{push}"
+	)
+'
+
+test_expect_success 'status.compareBranches from upstream has no duplicates' '
+	(
+		cd test &&
+		git checkout main &&
+		git 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 shows ahead of both upstream and push branch' '
+	(
+		cd test &&
+		git checkout -b feature2 origin/main &&
+		git push origin HEAD &&
+		advance work &&
+		git status >../actual
+	) &&
+	cat >expect <<-EOF &&
+	On branch feature2
+	Your branch is ahead of ${SQ}origin/main${SQ} by 1 commit.
+
+	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 'checkout with status.compareBranches shows both branches' '
+	(
+		cd test &&
+		git checkout feature2 >../actual
+	) &&
+	cat >expect <<-EOF &&
+	Your branch is ahead of ${SQ}origin/main${SQ} by 1 commit.
+
+	Your branch is ahead of ${SQ}origin/feature2${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' '
+	(
+		cd test &&
+		git checkout feature4 &&
+		git branch --set-upstream-to origin/main &&
+		git push origin HEAD &&
+		advance work &&
+		git 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' '
+	(
+		cd test &&
+		git checkout feature4 &&
+		git 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 &&
+		git config remote.pushDefault origin
+	)
+'
+
+test_expect_success 'status.compareBranches with upstream and origin remotes' '
+	(
+		cd test &&
+		git checkout -b feature5 upstream/main &&
+		git push origin &&
+		advance work &&
+		git 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 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 &&
+		advance work &&
+		git status >../actual
+	) &&
+	cat >expect <<-EOF &&
+	On branch feature7
+	Your branch is ahead of ${SQ}upstream/main${SQ} by 1 commit.
+
+	Your branch and ${SQ}origin/feature7${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' '
+	(
+		cd test &&
+		git checkout -b feature8 upstream/main &&
+		git push origin &&
+		git status >../actual
+	) &&
+	cat >expect <<-EOF &&
+	On branch feature8
+	Your branch is up to date with ${SQ}upstream/main${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 status.compareBranches up to date' '
+	(
+		cd test &&
+		git checkout feature8 &&
+		git push origin &&
+		git status --no-ahead-behind >../actual
+	) &&
+	cat >expect <<-EOF &&
+	On branch feature8
+	Your branch is up to date with ${SQ}upstream/main${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 with status.compareBranches shows up to date' '
+	(
+		cd test &&
+		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/feature8${SQ}.
+	EOF
+	test_cmp expect actual
+'
+
+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 feature9 upstream/main &&
+		git push origin &&
+		git branch --set-upstream-to upstream/ahead &&
+		git status >../actual
+	) &&
+	cat >expect <<-EOF &&
+	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/feature9${SQ}.
+
+	nothing to commit, working tree clean
+	EOF
+	test_cmp expect actual
+'
+
+test_expect_success 'status.compareBranches with remapped push refspec' '
+	(
+		cd test &&
+		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 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.
+	  (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' '
+	(
+		cd test &&
+		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 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.
+	  (use "git push" to publish your local commits)
+
+	nothing to commit, working tree clean
+	EOF
+	test_cmp expect actual
+'
+
+test_expect_success 'clean up after compareBranches tests' '
+	(
+		cd test &&
+		git config --unset status.compareBranches
+	)
+'
+
 test_done
-- 
gitgitgadget
Previous: Harald Nordgren via GitGitGadgetNext: Junio C Hamano
Message 205 of 259 in “status: show default branch comparison when tracking non-default branch”
  1. status: show default branch comparison when tracking non-default branchHarald Nordgren via GitGitGadget, Dec 23, 2025
  2. Junio C HamanoDec 23, 2025
  3. Harald NordgrenDec 23, 2025
  4. Harald NordgrenDec 23, 2025
  5. Chris TorekDec 23, 2025
  6. Junio C HamanoDec 23, 2025
  7. Harald NordgrenDec 23, 2025
  8. Harald NordgrenDec 23, 2025
  9. Chris TorekDec 23, 2025
  10. 0/2 status: show default branch comparison when tracking non-default branchHarald Nordgren via GitGitGadget, Dec 23, 2025
  11. 1/2 status: show comparison with upstream default branchHarald Nordgren via GitGitGadget, Dec 23, 2025
  12. 2/2 Simplify default branch comparison logicHarald Nordgren via GitGitGadget, Dec 23, 2025
  13. Yee Cheng ChinDec 23, 2025
  14. Harald NordgrenDec 23, 2025
  15. Harald NordgrenDec 24, 2025
  16. Junio C HamanoDec 24, 2025
  17. Yee Cheng ChinDec 24, 2025
  18. Yee Cheng ChinDec 24, 2025
  19. Harald NordgrenDec 24, 2025
  20. brian m. carlsonDec 24, 2025
  21. Junio C HamanoDec 24, 2025
  22. Junio C HamanoDec 24, 2025
  23. 0/3 status: show default branch comparison when tracking non-default branchHarald Nordgren via GitGitGadget, Dec 24, 2025
  24. 1/3 status: show comparison with upstream default branchHarald Nordgren via GitGitGadget, Dec 24, 2025
  25. 2/3 Simplify default branch comparison logicHarald Nordgren via GitGitGadget, Dec 24, 2025
  26. 3/3 Use repo.settings.statusGoalBranch config for status comparisonHarald Nordgren via GitGitGadget, Dec 24, 2025
  27. 0/4 status: show default branch comparison when tracking non-default branchHarald Nordgren via GitGitGadget, Dec 24, 2025
  28. 1/4 status: show comparison with upstream default branchHarald Nordgren via GitGitGadget, Dec 24, 2025
  29. 2/4 Simplify default branch comparison logicHarald Nordgren via GitGitGadget, Dec 24, 2025
  30. 3/4 Use repo.settings.statusGoalBranch config for status comparisonHarald Nordgren via GitGitGadget, Dec 24, 2025
  31. 4/4 Rename default_remote to goal_branchHarald Nordgren via GitGitGadget, Dec 24, 2025
  32. Harald NordgrenDec 24, 2025
  33. 0/5 status: show default branch comparison when tracking non-default branchHarald Nordgren via GitGitGadget, Dec 24, 2025
  34. 1/5 status: show comparison with upstream default branchHarald Nordgren via GitGitGadget, Dec 24, 2025
  35. 2/5 Simplify default branch comparison logicHarald Nordgren via GitGitGadget, Dec 24, 2025
  36. 3/5 Use repo.settings.statusGoalBranch config for status comparisonHarald Nordgren via GitGitGadget, Dec 24, 2025
  37. 4/5 Rename default_remote to goal_branchHarald Nordgren via GitGitGadget, Dec 24, 2025
  38. 5/5 Add warning for malformed statusGoalBranch configHarald Nordgren via GitGitGadget, Dec 24, 2025
  39. 0/6 status: show default branch comparison when tracking non-default branchHarald Nordgren via GitGitGadget, Dec 24, 2025
  40. 1/6 status: show comparison with upstream default branchHarald Nordgren via GitGitGadget, Dec 24, 2025
  41. 2/6 Simplify default branch comparison logicHarald Nordgren via GitGitGadget, Dec 24, 2025
  42. 3/6 Use repo.settings.statusGoalBranch config for status comparisonHarald Nordgren via GitGitGadget, Dec 24, 2025
  43. 4/6 Rename default_remote to goal_branchHarald Nordgren via GitGitGadget, Dec 24, 2025
  44. 5/6 Add warning for malformed statusGoalBranch configHarald Nordgren via GitGitGadget, Dec 24, 2025
  45. 6/6 Change config key to status.compareBranchHarald Nordgren via GitGitGadget, Dec 24, 2025
  46. Junio C HamanoDec 25, 2025
  47. status: additional comparison with goal branchHarald Nordgren via GitGitGadget, Dec 25, 2025
  48. Harald NordgrenDec 25, 2025
  49. status: show comparison with configured goal branchHarald Nordgren via GitGitGadget, Dec 25, 2025
  50. Junio C HamanoDec 26, 2025
  51. Harald NordgrenDec 26, 2025
  52. Code review?Harald Nordgren, Dec 28, 2025
  53. Junio C HamanoDec 28, 2025
  54. 0/2 status: show comparison with configured goal branchHarald Nordgren via GitGitGadget, Dec 28, 2025
  55. 1/2 status: show comparison with configured goal branchHarald Nordgren via GitGitGadget, Dec 28, 2025
  56. 2/2 improve testsHarald Nordgren via GitGitGadget, Dec 28, 2025
  57. Code review?Harald Nordgren, Dec 28, 2025
  58. Junio C HamanoDec 28, 2025
  59. Code review?Harald Nordgren, Dec 28, 2025
  60. Ben KnobleDec 28, 2025
  61. Triangular workflowsHarald Nordgren, Dec 29, 2025
  62. 0/3 status: show additional comparison with push branch when different from tracking branchHarald Nordgren via GitGitGadget, Dec 30, 2025
  63. 1/3 status: show comparison with configured goal branchHarald Nordgren via GitGitGadget, Dec 30, 2025
  64. 2/3 improve testsHarald Nordgren via GitGitGadget, Dec 30, 2025
  65. 3/3 use pushRemote and tracking branchHarald Nordgren via GitGitGadget, Dec 30, 2025
  66. Harald NordgrenDec 30, 2025
  67. Harald NordgrenJan 1, 2026
  68. Another look?Harald Nordgren, Jan 1, 2026
  69. Another look?Harald Nordgren, Jan 1, 2026
  70. Another look?Harald Nordgren, Jan 1, 2026
  71. Junio C HamanoJan 1, 2026
  72. Another look?Harald Nordgren, Jan 1, 2026
  73. Kristoffer HaugsbakkJan 2, 2026
  74. status: show comparison with push remote tracking branchHarald Nordgren via GitGitGadget, Jan 2, 2026
  75. Another look?Harald Nordgren, Jan 2, 2026
  76. Phillip WoodJan 2, 2026
  77. Another look?Harald Nordgren, Jan 2, 2026
  78. 0/2 status: show comparison with push remote tracking branchHarald Nordgren via GitGitGadget, Jan 2, 2026
  79. 1/2 refactor: format_branch_comparison in preparationHarald Nordgren via GitGitGadget, Jan 2, 2026
  80. 2/2 status: show comparison with push remote tracking branchHarald Nordgren via GitGitGadget, Jan 2, 2026
  81. 0/2 status: show comparison with push remote tracking branchHarald Nordgren via GitGitGadget, Jan 3, 2026
  82. 1/2 refactor: format_branch_comparison in preparationHarald Nordgren via GitGitGadget, Jan 3, 2026
  83. 2/2 status: show comparison with push remote tracking branchHarald Nordgren via GitGitGadget, Jan 3, 2026
  84. Phillip WoodJan 3, 2026
  85. Another look?Harald Nordgren, Jan 3, 2026
  86. 0/2 status: show comparison with push remote tracking branchHarald Nordgren via GitGitGadget, Jan 3, 2026
  87. 1/2 refactor: format_branch_comparison in preparationHarald Nordgren via GitGitGadget, Jan 3, 2026
  88. 2/2 status: show comparison with push remote tracking branchHarald Nordgren via GitGitGadget, Jan 3, 2026
  89. Junio C HamanoJan 4, 2026
  90. Nico WilliamsJan 4, 2026
  91. Junio C HamanoJan 4, 2026
  92. Junio C HamanoJan 4, 2026
  93. Another look?Harald Nordgren, Jan 4, 2026
  94. Another look?Harald Nordgren, Jan 4, 2026
  95. 0/2 status: show comparison with push remote tracking branchHarald Nordgren via GitGitGadget, Jan 4, 2026
  96. 1/2 refactor format_branch_comparison in preparationHarald Nordgren via GitGitGadget, Jan 4, 2026
  97. 2/2 status: show comparison with push remote tracking branchHarald Nordgren via GitGitGadget, Jan 4, 2026
  98. 0/2 status: show comparison with push remote tracking branchHarald Nordgren via GitGitGadget, Jan 4, 2026
  99. 1/2 refactor format_branch_comparison in preparationHarald Nordgren via GitGitGadget, Jan 4, 2026
  100. 2/2 status: show comparison with push remote tracking branchHarald Nordgren via GitGitGadget, Jan 4, 2026
  101. Junio C HamanoJan 5, 2026
  102. Junio C HamanoJan 5, 2026
  103. Another look?Harald Nordgren, Jan 5, 2026
  104. Another look?Harald Nordgren, Jan 5, 2026
  105. 0/2 status: show comparison with push remote tracking branchHarald Nordgren via GitGitGadget, Jan 5, 2026
  106. 1/2 refactor format_branch_comparison in preparationHarald Nordgren via GitGitGadget, Jan 5, 2026
  107. 2/2 status: show comparison with push remote tracking branchHarald Nordgren via GitGitGadget, Jan 5, 2026
  108. Junio C HamanoJan 5, 2026
  109. Another look?Harald Nordgren, Jan 5, 2026
  110. D. Ben KnobleJan 5, 2026
  111. Junio C HamanoJan 5, 2026
  112. ABQHarald Nordgren, Jan 6, 2026
  113. ABQHarald Nordgren, Jan 8, 2026
  114. Phillip WoodJan 9, 2026
  115. Phillip WoodJan 9, 2026
  116. Harald NordgrenJan 9, 2026
  117. Harald NordgrenJan 9, 2026
  118. Ben KnobleJan 9, 2026
  119. Patrick SteinhardtJan 9, 2026
  120. 0/2 status: show comparison with push remote tracking branchHarald Nordgren via GitGitGadget, Jan 9, 2026
  121. 1/2 refactor format_branch_comparison in preparationHarald Nordgren via GitGitGadget, Jan 9, 2026
  122. 2/2 status: show comparison with push remote tracking branchHarald Nordgren via GitGitGadget, Jan 9, 2026
  123. Harald NordgrenJan 9, 2026
  124. 0/2 status: show comparison with push remote tracking branchHarald Nordgren via GitGitGadget, Jan 9, 2026
  125. 1/2 refactor format_branch_comparison in preparationHarald Nordgren via GitGitGadget, Jan 9, 2026
  126. 2/2 status: show comparison with push remote tracking branchHarald Nordgren via GitGitGadget, Jan 9, 2026
  127. Junio C HamanoJan 10, 2026
  128. Junio C HamanoJan 10, 2026
  129. Junio C HamanoJan 10, 2026
  130. Harald NordgrenJan 10, 2026
  131. Harald NordgrenJan 10, 2026
  132. 0/2 status: show comparison with push remote tracking branchHarald Nordgren via GitGitGadget, Jan 10, 2026
  133. 1/2 refactor format_branch_comparison in preparationHarald Nordgren via GitGitGadget, Jan 10, 2026
  134. 2/2 status: show comparison with push remote tracking branchHarald Nordgren via GitGitGadget, Jan 10, 2026
  135. Harald NordgrenJan 10, 2026
  136. 0/2 status: show comparison with push remote tracking branchHarald Nordgren via GitGitGadget, Jan 10, 2026
  137. 1/2 refactor format_branch_comparison in preparationHarald Nordgren via GitGitGadget, Jan 10, 2026
  138. 2/2 status: show comparison with push remote tracking branchHarald Nordgren via GitGitGadget, Jan 10, 2026
  139. Junio C HamanoJan 10, 2026
  140. Junio C HamanoJan 10, 2026
  141. Junio C HamanoJan 10, 2026
  142. Harald NordgrenJan 10, 2026
  143. 0/2 status: show comparison with push remote tracking branchHarald Nordgren via GitGitGadget, Jan 10, 2026
  144. 1/2 refactor format_branch_comparison in preparationHarald Nordgren via GitGitGadget, Jan 10, 2026
  145. 2/2 status: show comparison with push remote tracking branchHarald Nordgren via GitGitGadget, Jan 10, 2026
  146. Harald NordgrenJan 10, 2026
  147. Junio C HamanoJan 11, 2026
  148. Kristoffer HaugsbakkJan 12, 2026
  149. Kristoffer HaugsbakkJan 12, 2026
  150. Phillip WoodJan 12, 2026
  151. Harald NordgrenJan 12, 2026
  152. 0/2 status: show comparison with push remote tracking branchHarald Nordgren via GitGitGadget, Jan 12, 2026
  153. 1/2 refactor format_branch_comparison in preparationHarald Nordgren via GitGitGadget, Jan 12, 2026
  154. 2/2 status: show comparison with push remote tracking branchHarald Nordgren via GitGitGadget, Jan 12, 2026
  155. Junio C HamanoJan 12, 2026
  156. Harald NordgrenJan 13, 2026
  157. 0/2 status: show comparison with push remote tracking branchHarald Nordgren via GitGitGadget, Jan 13, 2026
  158. 1/2 refactor format_branch_comparison in preparationHarald Nordgren via GitGitGadget, Jan 13, 2026
  159. 2/2 status: show comparison with push remote tracking branchHarald Nordgren via GitGitGadget, Jan 13, 2026
  160. Phillip WoodJan 13, 2026
  161. Harald NordgrenJan 13, 2026
  162. 0/2 status: show comparison with push remote tracking branchHarald Nordgren via GitGitGadget, Jan 13, 2026
  163. 1/2 refactor format_branch_comparison in preparationHarald Nordgren via GitGitGadget, Jan 13, 2026
  164. 2/2 status: show comparison with push remote tracking branchHarald Nordgren via GitGitGadget, Jan 13, 2026
  165. Jeff KingJan 13, 2026
  166. Triangular workflowHarald Nordgren, Jan 13, 2026
  167. Jeff KingJan 13, 2026
  168. Triangular workflowHarald Nordgren, Jan 13, 2026
  169. D. Ben KnobleJan 14, 2026
  170. Jeff KingJan 14, 2026
  171. Triangular workflowHarald Nordgren, Jan 14, 2026
  172. Triangular workflowHarald Nordgren, Jan 14, 2026
  173. Junio C HamanoJan 14, 2026
  174. Jeff KingJan 14, 2026
  175. Triangular workflowHarald Nordgren, Jan 14, 2026
  176. Junio C HamanoJan 14, 2026
  177. Jeff KingJan 14, 2026
  178. Jeff KingJan 14, 2026
  179. Ben KnobleJan 14, 2026
  180. Ben KnobleJan 14, 2026
  181. Ben KnobleJan 14, 2026
  182. Jeff KingJan 14, 2026
  183. Triangular workflowHarald Nordgren, Jan 14, 2026
  184. Triangular workflowHarald Nordgren, Jan 14, 2026
  185. Junio C HamanoJan 14, 2026
  186. Phillip WoodJan 15, 2026
  187. Junio C HamanoJan 15, 2026
  188. D. Ben KnobleJan 15, 2026
  189. Jeff KingJan 15, 2026
  190. Triangular workflowHarald Nordgren, Jan 18, 2026
  191. 0/2 status: add status.compareBranches config for multiple branch comparisonsHarald Nordgren via GitGitGadget, Jan 18, 2026
  192. 1/2 refactor format_branch_comparison in preparationHarald Nordgren via GitGitGadget, Jan 18, 2026
  193. 2/2 status: add status.compareBranches config for multiple branch comparisonsHarald Nordgren via GitGitGadget, Jan 18, 2026
  194. Jeff KingJan 19, 2026
  195. Chris TorekJan 19, 2026
  196. Triangular workflowHarald Nordgren, Jan 20, 2026
  197. Memory leakHarald Nordgren, Jan 20, 2026
  198. Memory leakHarald Nordgren, Jan 20, 2026
  199. Junio C HamanoJan 20, 2026
  200. Junio C HamanoJan 21, 2026
  201. Jeff KingJan 21, 2026
  202. Memory leakHarald Nordgren, Jan 22, 2026
  203. 0/2 status: add status.compareBranches config for multiple branch comparisonsHarald Nordgren via GitGitGadget, Jan 22, 2026
  204. 1/2 refactor format_branch_comparison in preparationHarald Nordgren via GitGitGadget, Jan 22, 2026
  205. 2/2 status: add status.compareBranches config for multiple branch comparisonsHarald Nordgren via GitGitGadget, Jan 22, 2026
  206. Junio C HamanoJan 22, 2026
  207. Junio C HamanoJan 22, 2026
  208. Jeff KingJan 22, 2026
  209. Harald NordgrenJan 22, 2026
  210. Junio C HamanoJan 22, 2026
  211. Harald NordgrenJan 22, 2026
  212. Harald NordgrenJan 22, 2026
  213. 0/2 status: add status.compareBranches config for multiple branch comparisonsHarald Nordgren via GitGitGadget, Jan 22, 2026
  214. 1/2 refactor format_branch_comparison in preparationHarald Nordgren via GitGitGadget, Jan 22, 2026
  215. 2/2 status: add status.compareBranches config for multiple branch comparisonsHarald Nordgren via GitGitGadget, Jan 22, 2026
  216. Junio C HamanoJan 22, 2026
  217. Junio C HamanoJan 22, 2026
  218. Harald NordgrenJan 22, 2026
  219. Junio C HamanoJan 22, 2026
  220. Junio C HamanoJan 22, 2026
  221. Jeff KingJan 22, 2026
  222. Jeff KingJan 22, 2026
  223. Jeff KingJan 22, 2026
  224. Junio C HamanoJan 22, 2026
  225. Harald NordgrenJan 24, 2026
  226. Junio C HamanoJan 25, 2026
  227. Harald NordgrenFeb 8, 2026
  228. Harald NordgrenFeb 21, 2026
  229. Junio C HamanoFeb 21, 2026
  230. D. Ben KnobleFeb 22, 2026
  231. Jeff KingFeb 23, 2026
  232. Harald NordgrenFeb 24, 2026
  233. Junio C HamanoFeb 24, 2026
  234. Harald NordgrenFeb 25, 2026
  235. Junio C HamanoFeb 25, 2026
  236. Jeff KingFeb 25, 2026
  237. Junio C HamanoFeb 25, 2026
  238. D. Ben KnobleFeb 25, 2026
  239. 0/2 status: add status.compareBranches config for multiple branch comparisonsHarald Nordgren via GitGitGadget, Feb 25, 2026
  240. 1/2 refactor format_branch_comparison in preparationHarald Nordgren via GitGitGadget, Feb 25, 2026
  241. 2/2 status: add status.compareBranches config for multiple branch comparisonsHarald Nordgren via GitGitGadget, Feb 25, 2026
  242. Junio C HamanoFeb 25, 2026
  243. 0/2 status: add status.compareBranches config for multiple branch comparisonsHarald Nordgren via GitGitGadget, Feb 26, 2026
  244. 1/2 refactor format_branch_comparison in preparationHarald Nordgren via GitGitGadget, Feb 26, 2026
  245. 2/2 status: add status.compareBranches config for multiple branch comparisonsHarald Nordgren via GitGitGadget, Feb 26, 2026
  246. Harald NordgrenFeb 26, 2026
  247. Harald NordgrenFeb 26, 2026
  248. Junio C HamanoFeb 26, 2026
  249. Harald NordgrenMar 1, 2026
  250. Kristoffer HaugsbakkMar 1, 2026
  251. Junio C HamanoMar 2, 2026
  252. Junio C HamanoMar 2, 2026
  253. Harald NordgrenMar 4, 2026
  254. 0/2 status: add status.compareBranches config for multiple branch comparisonsHarald Nordgren via GitGitGadget, Mar 4, 2026
  255. 1/2 refactor format_branch_comparison in preparationHarald Nordgren via GitGitGadget, Mar 4, 2026
  256. 2/2 status: add status.compareBranches config for multiple branch comparisonsHarald Nordgren via GitGitGadget, Mar 4, 2026
  257. Junio C HamanoMar 4, 2026
  258. Harald NordgrenMar 9, 2026
  259. Junio C HamanoMar 9, 2026

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.