   }
   
   func matches(url: URL) -> Bool {
-    return ignoredURLs.contains(url)
+    return ignoredURLs.contains(url) && !explicitlyIncludedURLs.contains(url)
   }
 }


    return true
  }

  static private func listFilePaths(pattern: String) -> [String] {
    guard !pattern.isEmpty else {
      return []


class IgnoreFile {
  private let ignoredURLs: [URL]
  private let explicitlyIncludedURLs: [URL]

  init() {
    ignoredURLs = []
    explicitlyIncludedURLs = []
  }

  init(ignoreFileURL: URL) throws {
    let workingDirectory = ignoreFileURL.deletingLastPathComponent()
    let potentialPatterns = try String(contentsOf: ignoreFileURL).components(separatedBy: .newlines)

    ignoredURLs = potentialPatterns
      .filter { IgnoreFile.isPattern(potentialPattern: $0) && !IgnoreFile.isExplicitlyIncludedPattern(potentialPattern: $0) }
      .flatMap { IgnoreFile.expandPattern($0, workingDirectory: workingDirectory) }
    explicitlyIncludedURLs = potentialPatterns
      .filter { IgnoreFile.isPattern(potentialPattern: $0) && IgnoreFile.isExplicitlyIncludedPattern(potentialPattern: $0) }
      .map { String($0.dropFirst()) }
      .flatMap { IgnoreFile.expandPattern($0, workingDirectory: workingDirectory) }
  }

  static private func isPattern(potentialPattern: String) -> Bool {
