]> git.ipfire.org Git - thirdparty/git.git/commitdiff
stash: honor stash.index in apply, pop modes
authorD. Ben Knoble <ben.knoble+github@gmail.com>
Mon, 22 Sep 2025 01:39:06 +0000 (21:39 -0400)
committerJunio C Hamano <gitster@pobox.com>
Mon, 22 Sep 2025 03:23:23 +0000 (20:23 -0700)
With stash.index=true, git-stash(1) command now tries to reinstate the
index by default in the "apply" and "pop" modes. Not doing so creates a
common trap [1], [2]: "git stash apply" is not the reverse of "git stash
push" because carefully staged indices are lost and have to be manually
recreated. OTOH, this mode is not always desirable and may create more
conflicts when applying stashes. As usual, "--no-index" will disable
this behavior if you set "stash.index".

[1]: https://lore.kernel.org/git/CAPx1GvcxyDDQmCssMjEnt6JoV6qPc5ZUpgPLX3mpUC_4PNYA1w@mail.gmail.com/
[2]: https://lore.kernel.org/git/c5a811ac-8cd3-c389-ac6d-29020a648c87@gmail.com/

Signed-off-by: D. Ben Knoble <ben.knoble+github@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/config/stash.adoc
builtin/stash.c
t/t3903-stash.sh

index ec1edaeba68aa3351331f03f981ceff9412d0899..e556105a15bd46c6489717b0aee663d461f98de1 100644 (file)
@@ -1,3 +1,8 @@
+stash.index::
+       If this is set to true, `git stash apply` and `git stash pop` will
+       behave as if `--index` was supplied. Defaults to false. See the
+       descriptions in linkgit:git-stash[1].
+
 stash.showIncludeUntracked::
        If this is set to true, the `git stash show` command will show
        the untracked files of a stash entry.  Defaults to false. See
index d9b478d1d108b67aa3724ea84102810df5618e2a..8a0eef3c704af8ccc6db4e19da2c498be0dbbd39 100644 (file)
@@ -130,6 +130,7 @@ static struct strbuf stash_index_path = STRBUF_INIT;
 static int show_stat = 1;
 static int show_patch;
 static int show_include_untracked;
+static int use_index;
 
 /*
  * w_commit is set to the commit containing the working tree
@@ -662,7 +663,7 @@ static int apply_stash(int argc, const char **argv, const char *prefix,
 {
        int ret = -1;
        int quiet = 0;
-       int index = 0;
+       int index = use_index;
        struct stash_info info = STASH_INFO_INIT;
        struct option options[] = {
                OPT__QUIET(&quiet, N_("be quiet, only report errors")),
@@ -759,7 +760,7 @@ static int pop_stash(int argc, const char **argv, const char *prefix,
                     struct repository *repo UNUSED)
 {
        int ret = -1;
-       int index = 0;
+       int index = use_index;
        int quiet = 0;
        struct stash_info info = STASH_INFO_INIT;
        struct option options[] = {
@@ -864,6 +865,10 @@ static int git_stash_config(const char *var, const char *value,
                show_include_untracked = git_config_bool(var, value);
                return 0;
        }
+       if (!strcmp(var, "stash.index")) {
+               use_index = git_config_bool(var, value);
+               return 0;
+       }
        return git_diff_basic_config(var, value, ctx, cb);
 }
 
index b8936a653b2f47cf4dcdb7e48182cab511c17335..d6127173b1184e3b616130fb0f842158110d26b8 100755 (executable)
@@ -1595,4 +1595,41 @@ test_expect_success 'stash apply reports a locked index' '
        )
 '
 
+test_expect_success 'stash.index=true implies --index' '
+       # setup for a few related tests
+       test_commit file base &&
+       echo index >file &&
+       git add file &&
+       echo working >file &&
+       git stash &&
+
+       test_when_finished "git reset --hard" &&
+       git -c stash.index=true stash apply &&
+       echo index >expect &&
+       git show :0:file >actual &&
+       test_cmp expect actual &&
+       echo working >expect &&
+       test_cmp expect file
+'
+
+test_expect_success 'stash.index=true overridden by --no-index' '
+       test_when_finished "git reset --hard" &&
+       git -c stash.index=true stash apply --no-index &&
+       echo base >expect &&
+       git show :0:file >actual &&
+       test_cmp expect actual &&
+       echo working >expect &&
+       test_cmp expect file
+'
+
+test_expect_success 'stash.index=false overridden by --index' '
+       test_when_finished "git reset --hard" &&
+       git -c stash.index=false stash apply --index &&
+       echo index >expect &&
+       git show :0:file >actual &&
+       test_cmp expect actual &&
+       echo working >expect &&
+       test_cmp expect file
+'
+
 test_done