RevWalk: getMergedInto's result is wrong on the second call

Make sure the future user can reset all UNINTERESTING commmits after
this operation.

Signed-off-by: kylezhao <kylezhao@tencent.com>
Change-Id: I7549b9ff67bd31acd5dfc92331cb9a30b47b8278
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevWalkUtilsReachableTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevWalkUtilsReachableTest.java
index d9ed0c1..200cb6a 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevWalkUtilsReachableTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/revwalk/RevWalkUtilsReachableTest.java
@@ -76,6 +76,28 @@ public void withCommitLoadedByDifferentRevWalk() throws Exception {
 		}
 	}
 
+	@Test
+	public void findBranchesReachableManyTimes() throws Exception {
+		/*
+		 *  a   b
+		 *  |   |
+		 *  c   d
+		 */
+		RevCommit a = commit();
+		RevCommit b = commit();
+		RevCommit c = commit(a);
+		RevCommit d = commit(b);
+		Ref branchA = branch("a", a);
+		Ref branchB = branch("b", b);
+		Ref branchC = branch("c", c);
+		Ref branchD = branch("d", d);
+
+		assertContains(a, asList(branchA, branchC));
+		assertContains(b, asList(branchB, branchD));
+		assertContains(c, asList(branchC));
+		assertContains(d, asList(branchD));
+	}
+
 	private Ref branch(String name, RevCommit dst) throws Exception {
 		return Git.wrap(db).branchCreate().setName(name)
 				.setStartPoint(dst.name()).call();
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevWalk.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevWalk.java
index 5d5ba12..d5b3643 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevWalk.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevWalk.java
@@ -527,10 +527,12 @@ public boolean isMergedIntoAll(RevCommit commit, Collection<Ref> refs)
 	private List<Ref> getMergedInto(RevCommit needle, Collection<Ref> haystacks,
 				Enum returnStrategy, ProgressMonitor monitor) throws IOException {
 		List<Ref> result = new ArrayList<>();
+		List<RevCommit> uninteresting = new ArrayList<>();
 		RevFilter oldRF = filter;
 		TreeFilter oldTF = treeFilter;
 		try {
 			finishDelayedFreeFlags();
+			reset(~freeFlags & APP_FLAGS);
 			filter = RevFilter.ALL;
 			treeFilter = TreeFilter.ALL;
 			for (Ref r: haystacks) {
@@ -559,13 +561,14 @@ private List<Ref> getMergedInto(RevCommit needle, Collection<Ref> haystacks,
 				}
 				if(!commitFound){
 					markUninteresting(c);
+					uninteresting.add(c);
 					if (returnStrategy == GetMergedIntoStrategy.RETURN_ON_FIRST_NOT_FOUND) {
 						return result;
 					}
 				}
 			}
 		} finally {
-			reset(~freeFlags & APP_FLAGS);
+			roots.addAll(uninteresting);
 			filter = oldRF;
 			treeFilter = oldTF;
 		}