Subject: [PATCH v2] docs: fix "git stash [push]" documentation

From: "Quentin Bernet via GitGitGadget" <[email-masked]>
Date: Mon, 30 Mar 2026 13:24:35 +0000

From: Quentin Bernet <[email-masked]>

Both the synopsis and explanation are incorrect and contradict each
other.
The synopsis claims "push" can only be omitted when you do not give any
options and arguments.
The explanation correctly claims that non-option arguments are not
allowed, except pathspec elements preceded by double hyphens.
But it also adds "-p" to the list of exceptions, even though it is an
option argument.

Signed-off-by: Quentin Bernet <[email-masked]>
---
    Fix git stash grammar

Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-2255%2FSporarum%2Fpatch-1-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-2255/Sporarum/patch-1-v2
Pull-Request: https://github.com/git/git/pull/2255

Range-diff vs v1:

 1:  e30696d3c4 ! 1:  927410a49d docs: fix git stash grammar
     @@ Metadata
      Author: Quentin Bernet <[email-masked]>
      
       ## Commit message ##
     -    docs: fix git stash grammar
     +    docs: fix "git stash [push]" documentation
      
     -    Grammar incorrectly did not include `git stash -m`
     -    and other valid `git stash push` flags
     +    Both the synopsis and explanation are incorrect and contradict each
     +    other.
     +    The synopsis claims "push" can only be omitted when you do not give any
     +    options and arguments.
     +    The explanation correctly claims that non-option arguments are not
     +    allowed, except pathspec elements preceded by double hyphens.
     +    But it also adds "-p" to the list of exceptions, even though it is an
     +    option argument.
      
          Signed-off-by: Quentin Bernet <[email-masked]>
      
     @@ Documentation/git-stash.adoc: git stash drop [-q | --quiet] [<stash>]
       git stash save [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | --quiet]
                  [-u | --include-untracked] [-a | --all] [<message>]
       git stash clear
     +@@ Documentation/git-stash.adoc: COMMANDS
     + 	the description along with the stashed state.
     + +
     + For quickly making a snapshot, you can omit "push".  In this mode,
     +-non-option arguments are not allowed to prevent a misspelled
     +-subcommand from making an unwanted stash entry.  The two exceptions to this
     +-are `stash -p` which acts as alias for `stash push -p` and pathspec elements,
     +-which are allowed after a double hyphen `--` for disambiguation.
     ++pathspec elements are only allowed after a double hyphen `--`
     ++to prevent a misspelled subcommand from making an unwanted stash entry.
     + 
     + `save [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-u | --include-untracked] [-a | --all] [-q | --quiet] [<message>]`::
     + 
      
       ## builtin/stash.c ##
      @@

 Documentation/git-stash.adoc | 10 ++++------
 builtin/stash.c              |  4 ++--
 2 files changed, 6 insertions(+), 8 deletions(-)

diff --git a/Documentation/git-stash.adoc b/Documentation/git-stash.adoc
index 235d57ddd8..b05c990ecd 100644
--- a/Documentation/git-stash.adoc
+++ b/Documentation/git-stash.adoc
@@ -14,10 +14,10 @@ git stash drop [-q | --quiet] [<stash>]
 git stash pop [--index] [-q | --quiet] [<stash>]
 git stash apply [--index] [-q | --quiet] [<stash>]
 git stash branch <branchname> [<stash>]
-git stash [push [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | --quiet]
+git stash [push] [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | --quiet]
 	     [-u | --include-untracked] [-a | --all] [(-m | --message) <message>]
 	     [--pathspec-from-file=<file> [--pathspec-file-nul]]
-	     [--] [<pathspec>...]]
+	     [--] [<pathspec>...]
 git stash save [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | --quiet]
            [-u | --include-untracked] [-a | --all] [<message>]
 git stash clear
@@ -60,10 +60,8 @@ COMMANDS
 	the description along with the stashed state.
 +
 For quickly making a snapshot, you can omit "push".  In this mode,
-non-option arguments are not allowed to prevent a misspelled
-subcommand from making an unwanted stash entry.  The two exceptions to this
-are `stash -p` which acts as alias for `stash push -p` and pathspec elements,
-which are allowed after a double hyphen `--` for disambiguation.
+pathspec elements are only allowed after a double hyphen `--`
+to prevent a misspelled subcommand from making an unwanted stash entry.
 
 `save [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-u | --include-untracked] [-a | --all] [-q | --quiet] [<message>]`::
 
diff --git a/builtin/stash.c b/builtin/stash.c
index 95c5005b0b..0d27b2fb1f 100644
--- a/builtin/stash.c
+++ b/builtin/stash.c
@@ -50,10 +50,10 @@
 #define BUILTIN_STASH_STORE_USAGE \
 	N_("git stash store [(-m | --message) <message>] [-q | --quiet] <commit>")
 #define BUILTIN_STASH_PUSH_USAGE \
-	N_("git stash [push [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | --quiet]\n" \
+	N_("git stash [push] [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | --quiet]\n" \
 	   "          [-u | --include-untracked] [-a | --all] [(-m | --message) <message>]\n" \
 	   "          [--pathspec-from-file=<file> [--pathspec-file-nul]]\n" \
-	   "          [--] [<pathspec>...]]")
+	   "          [--] [<pathspec>...]")
 #define BUILTIN_STASH_SAVE_USAGE \
 	N_("git stash save [-p | --patch] [-S | --staged] [-k | --[no-]keep-index] [-q | --quiet]\n" \
 	   "          [-u | --include-untracked] [-a | --all] [<message>]")

base-commit: ce74208c2fa13943fffa58f168ac27a76d0eb789
-- 
gitgitgadget