summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2016-04-26 00:17:15 +0200
committerJunio C Hamano <gitster@pobox.com>2016-04-26 00:17:15 +0200
commitf276cae18799ac8df2495b93cf0359a413789891 (patch)
tree88b4e119a06608fff800400d59dd4ee51a58c64a
parentMerge branch 'en/merge-octopus-fix' (diff)
parentbuiltin/merge.c: fix a bug with trivial merges (diff)
downloadgit-f276cae18799ac8df2495b93cf0359a413789891.tar.xz
git-f276cae18799ac8df2495b93cf0359a413789891.zip
Merge branch 'en/merge-trivial-fix'
When "git merge" notices that the merge can be resolved purely at the tree level (without having to merge blobs) and the resulting tree happens to already exist in the object store, it forgot to update the index, which lead to an inconsistent state for later operations. * en/merge-trivial-fix: builtin/merge.c: fix a bug with trivial merges t7605: add a testcase demonstrating a bug with trivial merges
-rw-r--r--builtin/merge.c8
-rwxr-xr-xt/t7605-merge-resolve.sh6
2 files changed, 13 insertions, 1 deletions
diff --git a/builtin/merge.c b/builtin/merge.c
index 1ec44f0c1b..b555a1bf9c 100644
--- a/builtin/merge.c
+++ b/builtin/merge.c
@@ -822,6 +822,14 @@ static int merge_trivial(struct commit *head, struct commit_list *remoteheads)
{
unsigned char result_tree[20], result_commit[20];
struct commit_list *parents, **pptr = &parents;
+ static struct lock_file lock;
+
+ hold_locked_index(&lock, 1);
+ refresh_cache(REFRESH_QUIET);
+ if (active_cache_changed &&
+ write_locked_index(&the_index, &lock, COMMIT_LOCK))
+ return error(_("Unable to write index."));
+ rollback_lock_file(&lock);
write_tree_trivial(result_tree);
printf(_("Wonderful.\n"));
diff --git a/t/t7605-merge-resolve.sh b/t/t7605-merge-resolve.sh
index 0cb9d11f21..5d56c38546 100755
--- a/t/t7605-merge-resolve.sh
+++ b/t/t7605-merge-resolve.sh
@@ -27,7 +27,7 @@ test_expect_success 'setup' '
git tag c3
'
-test_expect_success 'merge c1 to c2' '
+merge_c1_to_c2_cmds='
git reset --hard c1 &&
git merge -s resolve c2 &&
test "$(git rev-parse c1)" != "$(git rev-parse HEAD)" &&
@@ -41,6 +41,10 @@ test_expect_success 'merge c1 to c2' '
test 3 = $(git ls-files | wc -l)
'
+test_expect_success 'merge c1 to c2' "$merge_c1_to_c2_cmds"
+
+test_expect_success 'merge c1 to c2, again' "$merge_c1_to_c2_cmds"
+
test_expect_success 'merge c2 to c3 (fails)' '
git reset --hard c2 &&
test_must_fail git merge -s resolve c3