[PATCH v4 1/5] advice: add stashBeforeCheckout advice for dirty branch switches
- From
Arsh Srivastava via GitGitGadget <gitgitgadget@gmail.com>
- Date
- Mar 11, 2026, 08:50 UTC
- Message-ID
- <eb5639dbc3571fde15f2d93cf2d137b8df775d2f.1773219028.git.gitgitgadget@gmail.com>
- In-Reply-To
- <pull.2233.v4.git.git.1773219028.gitgitgadget@gmail.com>
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