Re: [PATCH v3 1/2] advice: add stashBeforeCheckout advice for dirty branch switches
- From
Arsh Srivastava <arshsrivastava00@gmail.com>
- Date
- Mar 10, 2026, 13:43 UTC
- Message-ID
- <CAOAgETOQ8eEKYc9qwShKOgO+50RzOMQdqTv0G3fOUznmw5Xzzg@mail.gmail.com>
- In-Reply-To
- <eb5639dbc3571fde15f2d93cf2d137b8df775d2f.1773149337.git.gitgitgadget@gmail.com>
Thank you so much for looking into my PR and i believe
> advice.h is used in the add.c file. > And advice really helps young developers
understand what's wrong in their files because navigating git and trying to find solutions is very difficult,
> causing them to go to ai models making them copy pasting machines.
On Tue, 10 Mar 2026 at 18:59, Arsh Srivastava via GitGitGadget <gitgitgadget@gmail.com> wrote:
Show 106 quoted lines
>
> From: Arsh Srivastava <arshsrivastava00@gmail.com>
>
> Add a new advice type ADVICE_STASH_BEFORE_CHECKOUT to guide users
> when they attempt to switch branches with local modifications that
> would be overwritten by the operation.
>
> This includes:
> > New ADVICE_STASH_BEFORE_CHECKOUT enum value in advice.h
> > Corresponding "stashBeforeCheckout" entry in advice_setting[]
> > New advise_on_checkout_dirty_files() function that lists the
> affected files and suggests using git stash push/pop
> > Documentation entry in Documentation/config/advice.txt
>
> The advice follows existing patterns established by
> advise_on_updating_sparse_paths() and can be silenced with:
>
> git config set advice.stashBeforeCheckout false
>
> Signed-off-by: Arsh Srivastava <arshsrivastava00@gmail.com>
> ---
> Documentation/config/advice.adoc | 5 +++++
> advice.c | 27 +++++++++++++++++++++++++++
> advice.h | 2 ++
> 3 files changed, 34 insertions(+)
>
> diff --git a/Documentation/config/advice.adoc b/Documentation/config/advice.adoc
> index 257db58918..8752e05636 100644
> --- a/Documentation/config/advice.adoc
> +++ b/Documentation/config/advice.adoc
> @@ -126,6 +126,11 @@ all advice messages.
> Shown when a sparse index is expanded to a full index, which is likely
> due to an unexpected set of files existing outside of the
> sparse-checkout.
> + stashBeforeCheckout::
> + Shown when the user attempts to switch branches but has
> + local modifications that would be overwritten by the
> + operation, to suggest using linkgit:git-stash[1] to
> + save changes before switching.
> statusAheadBehind::
> Shown when linkgit:git-status[1] computes the ahead/behind
> counts for a local ref compared to its remote tracking ref,
> diff --git a/advice.c b/advice.c
> index 0018501b7b..e1264f525c 100644
> --- a/advice.c
> +++ b/advice.c
> @@ -81,6 +81,7 @@ static struct {
> [ADVICE_SET_UPSTREAM_FAILURE] = { "setUpstreamFailure" },
> [ADVICE_SKIPPED_CHERRY_PICKS] = { "skippedCherryPicks" },
> [ADVICE_SPARSE_INDEX_EXPANDED] = { "sparseIndexExpanded" },
> + [ADVICE_STASH_BEFORE_CHECKOUT] = { "stashBeforeCheckout" },
> [ADVICE_STATUS_AHEAD_BEHIND_WARNING] = { "statusAheadBehindWarning" },
> [ADVICE_STATUS_HINTS] = { "statusHints" },
> [ADVICE_STATUS_U_OPTION] = { "statusUoption" },
> @@ -312,3 +313,29 @@ void advise_on_moving_dirty_path(struct string_list *pathspec_list)
> "* Use \"git add --sparse <paths>\" to update the index\n"
> "* Use \"git sparse-checkout reapply\" to apply the sparsity rules"));
> }
> +
> +void advise_on_checkout_dirty_files(struct string_list *file_list)
> +{
> + struct string_list_item *item;
> +
> + if (!file_list->nr)
> + return;
> +
> + fprintf(stderr, _("The following files have local modifications that would\n"
> + "be overwritten by switching branches:\n"));
> + for_each_string_list_item(item, file_list)
> + fprintf(stderr, "\t%s\n", item->string);
> +
> + advise_if_enabled(ADVICE_STASH_BEFORE_CHECKOUT,
> + _("You can save your local changes before switching by running:\n"
> + "\n"
> + "\tgit stash push\n"
> + "\n"
> + "Then restore them after switching with:\n"
> + "\n"
> + "\tgit stash pop\n"
> + "\n"
> + "Or to discard your local changes, use:\n"
> + "\n"
> + "\tgit checkout -- <file>"));
> +}
> diff --git a/advice.h b/advice.h
> index 8def280688..c035b5d8e3 100644
> --- a/advice.h
> +++ b/advice.h
> @@ -48,6 +48,7 @@ enum advice_type {
> ADVICE_SET_UPSTREAM_FAILURE,
> ADVICE_SKIPPED_CHERRY_PICKS,
> ADVICE_SPARSE_INDEX_EXPANDED,
> + ADVICE_STASH_BEFORE_CHECKOUT,
> ADVICE_STATUS_AHEAD_BEHIND_WARNING,
> ADVICE_STATUS_HINTS,
> ADVICE_STATUS_U_OPTION,
> @@ -83,5 +84,6 @@ void NORETURN die_ff_impossible(void);
> void advise_on_updating_sparse_paths(struct string_list *pathspec_list);
> void detach_advice(const char *new_name);
> void advise_on_moving_dirty_path(struct string_list *pathspec_list);
> +void advise_on_checkout_dirty_files(struct string_list *file_list);
>
> #endif /* ADVICE_H */
> --
> gitgitgadget
>