Junio C Hamano <junkio@xxxxxxx> writes: > Junio C Hamano <junkio@xxxxxxx> writes: > >>> Instead, just pass in "-u" to git-read-tree when we do a hard reset, and >>> depend on git-read-tree to update the working tree appropriately. >> >> Well, this is wrong. Local modifications remain after your >> version of "git-reset --hard HEAD". which is not what we want >> from a hard reset. > > ... and attempting to paper it over in git-reset.sh is also > wrong. Keep your "--hard is noop" change in git-reset.sh and > replace it with this would be the right fix. -- >8 -- read-tree -u one-way merge fix to check out locally modified paths. The "-u" flag means "update the working tree files", but to other types of merges, it also implies "I want to keep my local changes" -- because they prevent local changes from getting lost by using verify_uptodate. The one-way merge is different from other merges in that its purpose is opposite of doing something else while keeping unrelated local changes. The point of one-way merge is to nuke local changes. So while it feels somewhat wrong that this actively loses local changes, it is the right thing to do. The earlier one marked old->ce_flags to be updated unconditionally, but that would cause 18,000 paths to be updated when you have only a few paths different from the HEAD you are switching to, which is far worse than what we used to do in git-reset by hand. Signed-off-by: Junio C Hamano <junkio@xxxxxxx> --- * Third time lucky ;-) diff --git a/read-tree.c b/read-tree.c index 11157f4..d847c6f 100644 --- a/read-tree.c +++ b/read-tree.c @@ -686,6 +698,9 @@ static int oneway_merge(struct cache_ent if (!a) return deleted_entry(old, NULL); if (old && same(old, a)) { + struct stat st; + if (lstat(old->name, &st) || ce_match_stat(old, &st, 1)) + old->ce_flags |= htons(CE_UPDATE); return keep_entry(old); } return merged_entry(a, NULL); - : 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