anchor.diff:  
     @override
     Future<Iterable<Version>> getReleaseVersionTags() async {
  -    final gitDir = await _project.gitDir;
  +    final gitDir = _gitDir;
       return await gitFetchVersionTags(gitDir);
     }
   
     @override
     Future assertNoActiveReleases() async {
  -    final releaseNames = await gitFlowReleaseNames(await _project.gitDir);
  +    final releaseNames = await gitFlowReleaseNames(_gitDir);
       if (releaseNames.isNotEmpty) {
         throw new StateError(
             '${_project.name} has an existing release branch. Must finish all active releases first');
  
positive.code:           .getOrElse(() => false);
  }
  
  class GitFeatureCommandsSingleProjectFlowImpl implements GitFeatureCommands {
    final JefeProject _project;
    final GitDir _gitDir;
  
    GitFeatureCommandsSingleProjectFlowImpl(this._project, this._gitDir);
  
    Future init() => executeTask('git flow init', () async {
          await initGitFlow(await _project.gitDir);
        });
  
    Future featureStart(String featureName, {bool throwIfExists: false}) async {
  
negative.code:         // TODO: could check the branch is correctly based off develop
          _log.info('${_project.name} already on correct feature branch');
        } else {
          return gitCheckout(_gitDir, '$featureBranchPrefix$featureName');
        }
      } else {
        return gitFlowFeatureStart(_gitDir, featureName);
      }
    }
  
    Future featureFinish(String featureName,
        {bool excludeOnlyCommitIf(Commit commit): _dontExclude}) async {
      final GitDir gitDir = _gitDir;
      final Map<String, Commit> commits =
          await gitDir.getCommits('$developBranchName..HEAD');
      _log.info('found ${commits.length} commits on feature branch');
  