On Fri, Jun 5, 2015 at 11:36 PM, Junio C Hamano <gitster@xxxxxxxxx> wrote: > Paul Tan <pyokagan@xxxxxxxxx> writes: > >> Hmm, actually git-am.sh doesn't seem to do that even when we have a >> history to apply patches to. This is okay in the non-3way case, as >> git-apply will check to see if the patch applies before it modifies >> the index, but if we fall back on 3-way merge, any new files the >> failed merge added will not be deleted in the "git read-tree --reset >> -u HEAD HEAD". >> >> Should we do that? > > That sounds like the right thing to do; I agree that fixing it may > or may not be outside the scope of the immediate series. Hmm, thinking about it, the equivalent C code would be greatly affected by whatever behavior we go with, so I think we should try fixing the behavior first. This was done really quickly, but I think this may fix it: diff --git a/git-am.sh b/git-am.sh index 761befb..f7d54bf 100755 --- a/git-am.sh +++ b/git-am.sh @@ -502,7 +502,9 @@ then ;; t,) git rerere clear - git read-tree --reset -u HEAD HEAD + git read-tree --reset HEAD HEAD && + our_tree=$(git write-tree) && + git read-tree -m -u $our_tree HEAD orig_head=$(cat "$GIT_DIR/ORIG_HEAD") git reset HEAD git update-ref ORIG_HEAD $orig_head diff --git a/t/t4153-am-clean-index.sh b/t/t4153-am-clean-index.sh new file mode 100755 index 0000000..6d696db --- /dev/null +++ b/t/t4153-am-clean-index.sh @@ -0,0 +1,30 @@ +#!/bin/sh + +test_description='test clean index with am' +. ./test-lib.sh + +test_expect_success setup ' + test_commit initial file && + test_commit master-commit file && + git checkout -b conflict master^ && + echo conflict-commit >file && + echo newfile >newfile && + git add newfile && + test_tick && + git commit -a -m conflict-commit && + git format-patch --stdout initial >conflict.patch && + git checkout master +' + +test_expect_success 'am -3 pauses on conflict' ' + test_must_fail git am -3 conflict.patch && + echo newfile >expected && + test_cmp newfile expected +' + +test_expect_success 'am --skip removes newfile' ' + git am --skip && + test_path_is_missing newfile +' + +test_done However, it assumes that the contents of the index are from the failed merge. If the user modified the index before running git-am --skip, e.g. the user added a file, then that file would be deleted, which may not be desired... Thanks, Paul -- 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