Re: [PATCH v2] advice: add stashBeforeCheckout advice for dirty branch switches
- From
Arsh Srivastava <arshsrivastava00@gmail.com>
- Date
- Mar 10, 2026, 11:04 UTC
- Message-ID
- <CAOAgETOQzQceHbevFa_uTQ6rm=9NzsruPqDOJhnj_E_vUp0Bfg@mail.gmail.com>
- In-Reply-To
- <CAOAgETOebObfZNWA5LWMDxYv8YXYpbrb9L3_ASs_AbQjiQZYZw@mail.gmail.com>
I have as you mentioned changed
> Rebased my files pointer > Changed advice to git checkout -m
Thank you
Signed-off-by: Arsh Srivastava <arshsrivastava00@gmail.com>
On Tue, 10 Mar 2026 at 16:33, Arsh Srivastava <arshsrivastava00@gmail.com> wrote:
Show 155 quoted lines
>
> I have as you mentioned changed
> > Rebased my files pointer
> > Changed advice to git checkout -m
> Thank you
>
> Signed-off-by: Arsh Srivastava <arshsrivastava00@gmail.com>
>
> On Tue, 10 Mar 2026 at 4:29 PM, Arsh Srivastava via GitGitGadget <gitgitgadget@gmail.com> wrote:
>>
>> 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>
>> ---
>> 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