Re: [PATCH v2] advice: add stashBeforeCheckout advice for dirty branch switches
From: Arsh Srivastava <hidden>
Date: 2026-03-10 11:04:44
I have as you mentioned changed
Rebased my files pointer Changed advice to git checkout -m
Thank you Signed-off-by: Arsh Srivastava <redacted> On Tue, 10 Mar 2026 at 16:33, Arsh Srivastava [off-list ref] wrote:
I have as you mentioned changedquoted
Rebased my files pointer Changed advice to git checkout -mThank you Signed-off-by: Arsh Srivastava <redacted> On Tue, 10 Mar 2026 at 4:29 PM, Arsh Srivastava via GitGitGadget [off-list ref] wrote:quoted
From: Arsh Srivastava <redacted> 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:quoted
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 theaffected files and suggests using git stash push/popquoted
Documentation entry in Documentation/config/advice.txtThe 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 <redacted> --- 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 <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 */base-commit: d181b9354cf85b44455ce3ca9e6af0b9559e0ae2 -- gitgitgadget