summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--commit.c11
-rwxr-xr-xt/t7600-merge.sh22
2 files changed, 31 insertions, 2 deletions
diff --git a/commit.c b/commit.c
index 03e73f3..5148ec5 100644
--- a/commit.c
+++ b/commit.c
@@ -745,15 +745,22 @@ struct commit_list *reduce_heads(struct commit_list *heads)
for (p = heads; p; p = p->next) {
struct commit_list *q, *base;
+ /* Do we already have this in the result? */
+ for (q = result; q; q = q->next)
+ if (p->item == q->item)
+ break;
+ if (q)
+ continue;
+
num_other = 0;
for (q = heads; q; q = q->next) {
if (p->item == q->item)
continue;
other[num_other++] = q->item;
}
- if (num_other) {
+ if (num_other)
base = get_merge_bases_many(p->item, num_other, other, 1);
- } else
+ else
base = NULL;
/*
* If p->item does not have anything common with other
diff --git a/t/t7600-merge.sh b/t/t7600-merge.sh
index f035ea3..d4cf628 100755
--- a/t/t7600-merge.sh
+++ b/t/t7600-merge.sh
@@ -490,4 +490,26 @@ test_expect_success 'merge c1 with c0, c2, c0, and c1' '
test_debug 'gitk --all'
+test_expect_success 'merge c1 with c0, c2, c0, and c1' '
+ git reset --hard c1 &&
+ git config branch.master.mergeoptions "" &&
+ test_tick &&
+ git merge c0 c2 c0 c1 &&
+ verify_merge file result.1-5 &&
+ verify_parents $c1 $c2
+'
+
+test_debug 'gitk --all'
+
+test_expect_success 'merge c1 with c1 and c2' '
+ git reset --hard c1 &&
+ git config branch.master.mergeoptions "" &&
+ test_tick &&
+ git merge c1 c2 &&
+ verify_merge file result.1-5 &&
+ verify_parents $c1 $c2
+'
+
+test_debug 'gitk --all'
+
test_done