stash: restore untracked files AFTER restoring tracked files
If a user deletes a file and places a directory of untracked files there, then stashes all these changes, the untracked directory of files cannot be restored until after the corresponding file in the way is removed. So, restore changes to tracked files before restoring untracked files. There is no counterpart problem to worry about with the user deleting an untracked file and then add a tracked one in its place. Git does not track untracked files, and so will not know the untracked file was deleted, and thus won't be able to stash the removal of that file. Signed-off-by: Elijah Newren <newren@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Elijah Newren committed
Sep 10, 2021 at 10:29 UTC
bee8691f197ae6b74ca26081c1a3fa218e2b9db7
2 files changed
+5
-5
builtin/stash.c
+3
-3
@@ -535,9 +535,6 @@ static int do_apply_stash(const char *prefix, struct stash_info *info,
535
}
536
}
537
538
- if (info->has_u && restore_untracked(&info->u_tree))
539
- return error(_("could not restore untracked files from stash"));
540
-
538
init_merge_options(&o, the_repository);
539
540
o.branch1 = "Updated upstream";
@@ -572,6 +569,9 @@ static int do_apply_stash(const char *prefix, struct stash_info *info,
569
unstage_changes_unless_new(&c_tree);
570
}
571
572
+ if (info->has_u && restore_untracked(&info->u_tree))
573
+ return error(_("could not restore untracked files from stash"));
574
+
575
if (!quiet) {
576
struct child_process cp = CHILD_PROCESS_INIT;
577
t/t3903-stash.sh
+2
-2
@@ -1324,7 +1324,7 @@ test_expect_success 'git stash succeeds despite directory/file change' '
1324
)
1325
'
1326
1327
-test_expect_failure 'git stash can pop file -> directory saved changes' '
1327
+test_expect_success 'git stash can pop file -> directory saved changes' '
1328
test_create_repo directory_file_switch_v2 &&
1329
(
1330
cd directory_file_switch_v2 &&
@@ -1344,7 +1344,7 @@ test_expect_failure 'git stash can pop file -> directory saved changes' '
1344
)
1345
'
1346
1347
-test_expect_failure 'git stash can pop directory -> file saved changes' '
1347
+test_expect_success 'git stash can pop directory -> file saved changes' '
1348
test_create_repo directory_file_switch_v3 &&
1349
(
1350
cd directory_file_switch_v3 &&