From: Arsh Srivastava Date: Tue, 10 Mar 2026 13:43:05 GMT Subject: Re: [PATCH v3 1/2] advice: add stashBeforeCheckout advice for dirty branch switches Message-ID: In-Reply-To: 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 wrote: > > From: Arsh Srivastava > > 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 > --- > 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 \" 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 -- ")); > +} > 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 >