From: Arsh Srivastava Date: Tue, 10 Mar 2026 11:04:31 GMT Subject: Re: [PATCH v2] advice: add stashBeforeCheckout advice for dirty branch switches Message-ID: In-Reply-To: I have as you mentioned changed > Rebased my files pointer > Changed advice to git checkout -m Thank you Signed-off-by: Arsh Srivastava On Tue, 10 Mar 2026 at 16:33, Arsh Srivastava wrote: > > I have as you mentioned changed > > Rebased my files pointer > > Changed advice to git checkout -m > Thank you > > Signed-off-by: Arsh Srivastava > > On Tue, 10 Mar 2026 at 4:29 PM, 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 >> --- >> Advice on checkout dirty files >> >> This is my submission for microproject [GSOC] >> >> This patch adds a new advice type ADVICE_STASH_BEFORE_CHECKOUT to help >> users when they attempt to switch branches with local modifications that >> would be overwritten by the operation. >> >> The new advice follows the same patterns established by existing advice >> functions such as advise_on_updating_sparse_paths(). When triggered, it >> lists the affected files and suggests using git stash push/pop to save >> and restore local changes. >> >> The advice can be silenced with: >> >> git config set advice.stashBeforeCheckout false >> >> Changes: >> >> > advice.h: add ADVICE_STASH_BEFORE_CHECKOUT enum value advice.c: add >> > "stashBeforeCheckout" to advice_setting[] and implement >> > advise_on_checkout_dirty_files() function >> > Documentation/config/advice.adoc: document the new advice key >> >> Signed-off-by: Arsh Srivastava arshsrivastava00@gmail.com >> >> Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-2233%2FArsh123344423%2Fadvice_on_checkout_dirty_files-v2 >> Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-2233/Arsh123344423/advice_on_checkout_dirty_files-v2 >> Pull-Request: https://github.com/git/git/pull/2233 >> >> Range-diff vs v1: >> >> 1: 0ed992956e < -: ---------- diff: handle ANSI escape codes in prefix when calculating diffstat width >> 2: c70043a2c0 < -: ---------- t4052: test for diffstat width when prefix contains ANSI escape codes >> 3: 185356a454 < -: ---------- repo: remove unnecessary variable shadow >> 4: acebdd714b < -: ---------- The 13th batch >> 5: 9ec447e3cb = 1: eb5639dbc3 advice: add stashBeforeCheckout advice for dirty branch switches >> >> >> 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 */ >> >> base-commit: d181b9354cf85b44455ce3ca9e6af0b9559e0ae2 >> -- >> gitgitgadget