Thanks to b65982b (Optimize "diff-index --cached" using cache-tree, 2009-05-20), resetting with paths is much faster than resetting without paths. Some timings for the linux-2.6 repo to illustrate this (best of five, warm cache): reset reset . real 0m0.219s 0m0.080s user 0m0.140s 0m0.040s sys 0m0.070s 0m0.030s These two commands should do the same thing, so instead of having the user type the trailing " ." to get the faster do_diff_cache()-based implementation, always use it when doing a mixed reset, with or without paths (so "git reset $rev" would also be faster). Comparing before and after (best of five): Before After reset (warm cache): 0.21 0.07 reset -q (warm cache) 0.17 0.03 reset (cold cache): 10.31 2.72 reset -q (cold cache) 7.64 0.38 --- Are unmerged entries handled the same? read_from_tree() calls read_cache(), while reset_index() calls read_cache_unmerged(). I haven't figured out if/why they should be different. Are there other differences, or could unpack_trees() learn the same optimization as do_diff_cache()? Actually, the commit mentioned above does say Tweak unpack_trees() logic that is used to read in the tree object to catch the case where the tree entry we are looking at matches the index as a whole by looking at the cache-tree. If there are differences, we are clearly missing tests for them. And it seems like any difference between them should be fixed, so "git reset" and "git reset ." (from root of tree) do the same thing even before this patch. builtin/reset.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/builtin/reset.c b/builtin/reset.c index 5cd48ac..6db0a10 100644 --- a/builtin/reset.c +++ b/builtin/reset.c @@ -320,7 +320,7 @@ int cmd_reset(int argc, const char **argv, const char *prefix) if (reset_type != SOFT) { struct lock_file *lock = xcalloc(1, sizeof(struct lock_file)); int newfd = hold_locked_index(lock, 1); - if (pathspec) { + if (reset_type == MIXED) { if (read_from_tree(pathspec, sha1)) return 1; } else { -- 1.8.1.rc3.331.g1ef2165 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html