In unpack-trees.c in the check_ok_to_remove() function: add a new statement, if the file has the same content as the merged file, it can be removed. test this new behaviour in t7615. Signed-off-by: Jonathan <git.jonathan.bressat@xxxxxxxxx> Signed-off-by: COGONI Guillaume <cogoni.guillaume@xxxxxxxxx> --- t/t7615-merge-untracked.sh | 8 ++++---- unpack-trees.c | 5 ++++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/t/t7615-merge-untracked.sh b/t/t7615-merge-untracked.sh index 053e6b80ee..99f8bae4c0 100755 --- a/t/t7615-merge-untracked.sh +++ b/t/t7615-merge-untracked.sh @@ -12,13 +12,13 @@ test_expect_success 'setup' ' git checkout -b A ' -test_expect_success 'fastforward fail when untracked file has the same content' ' +test_expect_success 'fastforward overwrite untracked file that has the same content' ' test_when_finished "git branch -D B && git reset --hard init && git clean --force" && git checkout -b B && test_commit --no-tag "tracked" file "content" && git checkout A && echo content >file && - test_must_fail git merge B + git merge B ' test_expect_success 'fastforward fail when untracked file has different content' ' @@ -30,14 +30,14 @@ test_expect_success 'fastforward fail when untracked file has different content' test_must_fail git merge B ' -test_expect_success 'normal merge fail when untracked file has the same content' ' +test_expect_success 'normal merge overwrite untracked file that has the same content' ' test_when_finished "git branch -D B && git reset --hard init && git clean --force" && git checkout -b B && test_commit --no-tag "tracked" file "content" fileB "content" && git switch A && test_commit --no-tag "exA" fileA "content" && echo content >file && - test_must_fail git merge B + git merge B ' test_expect_success 'normal merge fail when untracked file has different content' ' diff --git a/unpack-trees.c b/unpack-trees.c index 360844bda3..61e06c04be 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -2257,6 +2257,8 @@ static int check_ok_to_remove(const char *name, int len, int dtype, if (result) { if (result->ce_flags & CE_REMOVE) return 0; + } else if (!ie_modified(&o->result, ce, st, 0)) { + return 0; } return add_rejected_path(o, error_type, name); @@ -2264,7 +2266,8 @@ static int check_ok_to_remove(const char *name, int len, int dtype, /* * We do not want to remove or overwrite a working tree file that - * is not tracked, unless it is ignored. + * is not tracked, unless it is ignored and unless it has the same + * content than the merged file. */ static int verify_absent_1(const struct cache_entry *ce, enum unpack_trees_error_types error_type, -- 2.35.1.7.gc8609858e0.dirty