Skip to content

Commit 40d7194

Browse files
newrengitster
authored andcommitted
builtin/merge.c: fix a bug with trivial merges
If read_tree_trivial() succeeds and produces a tree that is already in the object store, then the index is not written to disk, leaving it out-of-sync with both HEAD and the working tree. In order to write the index back out to disk after a merge, write_index_locked() needs to be called. For most merge strategies, this is done from try_merge_strategy(). For fast forward updates, this is done from checkout_fast_forward(). When trivial merges work, the call to write_index_locked() is buried a little deeper: merge_trivial() -> write_tree_trivial() -> write_cache_as_tree() -> write_index_as_tree() -> write_locked_index() However, it is only called when !cache_tree_fully_valid(), which is how this bug is triggered. But that also shows why this bug doesn't affect any other merge strategies or cases. Add a direct call to write_index_locked() from merge_trivial() to fix this issue. Since the indirect call to write_locked_index() was conditional on cache_tree_fully_valid(), it won't be written twice. Signed-off-by: Elijah Newren <newren@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
1 parent ef7d362 commit 40d7194

File tree

2 files changed

+9
-1
lines changed

2 files changed

+9
-1
lines changed

builtin/merge.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -822,6 +822,14 @@ static int merge_trivial(struct commit *head, struct commit_list *remoteheads)
822822
{
823823
unsigned char result_tree[20], result_commit[20];
824824
struct commit_list *parents, **pptr = &parents;
825+
static struct lock_file lock;
826+
827+
hold_locked_index(&lock, 1);
828+
refresh_cache(REFRESH_QUIET);
829+
if (active_cache_changed &&
830+
write_locked_index(&the_index, &lock, COMMIT_LOCK))
831+
return error(_("Unable to write index."));
832+
rollback_lock_file(&lock);
825833

826834
write_tree_trivial(result_tree);
827835
printf(_("Wonderful.\n"));

t/t7605-merge-resolve.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ merge_c1_to_c2_cmds='
4343

4444
test_expect_success 'merge c1 to c2' "$merge_c1_to_c2_cmds"
4545

46-
test_expect_failure 'merge c1 to c2, again' "$merge_c1_to_c2_cmds"
46+
test_expect_success 'merge c1 to c2, again' "$merge_c1_to_c2_cmds"
4747

4848
test_expect_success 'merge c2 to c3 (fails)' '
4949
git reset --hard c2 &&

0 commit comments

Comments
 (0)