startCommits could contain the same commit more than once, since its a List. Maybe you want to convert it over to a Set first to ensure its unique, or handle that case here specially when the commitToReachability map already contains the commit in it?

Or if you use the RevCommit subclass approach, you can just test for the BitSet field being non-null and refuse to reassign it, instead setting the corresponding start bit.