code: def evaluate_version_bump(current_version: str, force: str = None) -> Optional[str]:
      
      debug('evaluate_version_bump("{}", "{}")'.format(current_version, force))
      if force:
          return force
  
      bump = None
  
      changes = []
      commit_count = 0
  
      for _hash, commit_message in get_commit_log('v{0}'.format(current_version)):
          if (current_version in commit_message and
                  config.get('semantic_release', 'version_source') == 'commit'):
              debug('found {} in "{}. breaking loop'.format(current_version, commit_message))
              break
          try:
              message = current_commit_parser()(commit_message)
              changes.append(message[0])
          except UnknownCommitMessageStyleError as err:
              debug('ignored', err)
              pass
  
          commit_count += 1
  
      if changes:
          level = max(changes)
          if level in LEVELS:
              bump = LEVELS[level]
      if config.getboolean('semantic_release', 'patch_without_tag') and commit_count:
          bump = 'patch'
      return bump
docs: Reads git log since last release to find out if should be a major, minor or patch release.
  
      :param current_version: A string with the current version number.
      :param force: A string with the bump level that should be forced.
      :return: A string with either major, minor or patch if there should be a release. If no release
               is necessary None will be returned.