From: "Arsh Srivastava via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Phillip Wood <phillip.wood123@gmail.com>,
Arsh Srivastava <arshsrivastava00@gmail.com>,
Arsh Srivastava <arshsrivastava00@gmail.com>,
Arsh Srivastava <arshsrivastava00@gmail.com>
Subject: [PATCH v2] advice: add stashBeforeCheckout advice for dirty branch switches
Date: Tue, 10 Mar 2026 10:59:24 +0000 [thread overview]
Message-ID: <pull.2233.v2.git.git.1773140364525.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.2233.git.git.1773132678.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>
---
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
next prev parent reply other threads:[~2026-03-10 10:59 UTC|newest]
Thread overview: 62+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-10 8:51 [PATCH 0/5] Advice on checkout dirty files Arsh Srivastava via GitGitGadget
2026-03-10 8:51 ` [PATCH 1/5] diff: handle ANSI escape codes in prefix when calculating diffstat width LorenzoPegorari via GitGitGadget
2026-03-10 8:51 ` [PATCH 2/5] t4052: test for diffstat width when prefix contains ANSI escape codes LorenzoPegorari via GitGitGadget
2026-03-10 8:51 ` [PATCH 3/5] repo: remove unnecessary variable shadow K Jayatheerth via GitGitGadget
2026-03-10 8:51 ` [PATCH 4/5] The 13th batch Junio C Hamano via GitGitGadget
2026-03-10 8:51 ` [PATCH 5/5] advice: add stashBeforeCheckout advice for dirty branch switches Arsh Srivastava via GitGitGadget
2026-03-10 10:33 ` [PATCH 0/5] Advice on checkout dirty files Phillip Wood
2026-03-10 10:42 ` Arsh Srivastava
2026-03-10 10:45 ` Arsh Srivastava
2026-03-10 13:36 ` Junio C Hamano
2026-03-10 13:40 ` Arsh Srivastava
2026-03-10 15:40 ` Junio C Hamano
2026-03-10 16:05 ` Arsh Srivastava
2026-03-10 16:08 ` Arsh Srivastava
2026-03-10 10:59 ` Arsh Srivastava via GitGitGadget [this message]
[not found] ` <CAOAgETOebObfZNWA5LWMDxYv8YXYpbrb9L3_ASs_AbQjiQZYZw@mail.gmail.com>
2026-03-10 11:04 ` [PATCH v2] advice: add stashBeforeCheckout advice for dirty branch switches Arsh Srivastava
2026-03-10 13:16 ` Patrick Steinhardt
2026-03-10 13:36 ` Arsh Srivastava
2026-03-10 14:24 ` Patrick Steinhardt
2026-03-10 13:28 ` [PATCH v3 0/2] Advice on checkout dirty files Arsh Srivastava via GitGitGadget
2026-03-10 13:28 ` [PATCH v3 1/2] advice: add stashBeforeCheckout advice for dirty branch switches Arsh Srivastava via GitGitGadget
2026-03-10 13:43 ` Arsh Srivastava
2026-03-10 13:28 ` [PATCH v3 2/2] advice: add stashBeforeCheckout advice for dirty branch switches [GSOC] Arsh Srivastava via GitGitGadget
2026-03-11 8:50 ` [PATCH v4 0/5] Advice on checkout dirty files Arsh Srivastava via GitGitGadget
2026-03-11 8:50 ` [PATCH v4 1/5] advice: add stashBeforeCheckout advice for dirty branch switches Arsh Srivastava via GitGitGadget
2026-03-11 8:50 ` [PATCH v4 2/5] advice: add stashBeforeCheckout advice for dirty branch switches [GSOC] Arsh Srivastava via GitGitGadget
2026-03-11 8:50 ` [PATCH v4 3/5] unpack-trees: suggesting 'git checkout -m <branch>' with its repercussions Arsh Srivastava via GitGitGadget
2026-03-11 8:50 ` [PATCH v4 4/5] Updating tests and unpack-tress.c [GSOC] Arsh Srivastava via GitGitGadget
2026-03-11 8:50 ` [PATCH v4 5/5] File updation [GSOC] Arsh Srivastava via GitGitGadget
2026-03-11 16:38 ` [PATCH v4 0/5] Advice on checkout dirty files Junio C Hamano
2026-03-11 17:06 ` Arsh Srivastava
2026-03-11 17:49 ` [PATCH v5 0/3] " Arsh Srivastava via GitGitGadget
2026-03-11 17:49 ` [PATCH v5 1/3] advice: add stashBeforeCheckout advice for dirty branch switches Arsh Srivastava via GitGitGadget
2026-03-11 17:49 ` [PATCH v5 2/3] advice: add stashBeforeCheckout advice for dirty branch switches [GSOC] Arsh Srivastava via GitGitGadget
2026-03-11 17:49 ` [PATCH v5 3/3] unpack-trees: suggesting 'git checkout -m <branch>' with its repercussions Arsh Srivastava via GitGitGadget
2026-03-12 1:02 ` [PATCH v5 0/3] Advice on checkout dirty files Junio C Hamano
2026-03-12 3:32 ` Arsh Srivastava
2026-03-12 4:00 ` [PATCH v6] unpack-trees: suggesting 'git checkout -m' with its repercussions Arsh Srivastava via GitGitGadget
2026-03-12 16:06 ` Junio C Hamano
2026-03-12 18:13 ` Arsh Srivastava
2026-03-12 18:56 ` Junio C Hamano
2026-03-12 19:03 ` Arsh Srivastava
2026-03-12 19:07 ` Junio C Hamano
2026-03-12 19:12 ` Arsh Srivastava
2026-03-12 20:05 ` [PATCH v7] unpack-trees: suggest using 'git stash' when checkout fails Arsh Srivastava via GitGitGadget
2026-03-12 22:40 ` Junio C Hamano
2026-03-13 3:13 ` Arsh Srivastava
2026-03-13 10:43 ` Karthik Nayak
2026-03-13 11:02 ` Arsh Srivastava
2026-03-13 22:05 ` Junio C Hamano
2026-03-13 10:49 ` Arsh Srivastava
2026-03-13 11:04 ` Arsh Srivastava
2026-03-10 14:31 ` [PATCH v2] advice: add stashBeforeCheckout advice for dirty branch switches Karthik Nayak
2026-03-10 14:37 ` Arsh Srivastava
2026-03-10 14:40 ` Arsh Srivastava
2026-03-10 17:15 ` Karthik Nayak
2026-03-10 18:00 ` Arsh Srivastava
2026-03-10 14:41 ` Arsh Srivastava
2026-03-10 16:48 ` Junio C Hamano
2026-03-10 17:09 ` Karthik Nayak
2026-03-14 4:27 ` Konstantin Ryabitsev
2026-03-10 17:56 ` Arsh Srivastava
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=pull.2233.v2.git.git.1773140364525.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=arshsrivastava00@gmail.com \
--cc=git@vger.kernel.org \
--cc=phillip.wood123@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox