anchor.diff:          }
         });
   
  -  ProjectCommand checkout(String branchName) =>
  -      projectCommand('git checkout $branchName', (Project p) async {
  +  Future checkout(String branchName) =>
  +      executeTask('git checkout $branchName', () async {
           await gitCheckout(await _project.gitDir, branchName);
         });
   
  -  ProjectCommand updateFromRemote(String branchName,
  -          [String remoteName = 'origin']) =>
  -      projectCommand('git update from remote: $branchName', (Project p) async {
  +  Future updateFromRemote(String branchName, [String remoteName = 'origin']) =>
  +      executeTask('git update from remote: $branchName', () async {
           final gitDir = await _project.gitDir;
           await gitCheckout(gitDir, branchName);
           await gitMerge(gitDir, '$remoteName/$branchName');
         });
   
  -  ProjectCommand merge(String commit) =>
  -      projectCommand('git merge $commit', (Project p) async {
  +  Future merge(String commit) => executeTask('git merge $commit', () async {
           await gitMerge(await _project.gitDir, commit);
         });
   }
  
positive.code: 
  library jefe.project.commands.git.impl;
  
  import 'package:jefe/src/git/git.dart';
  import 'package:jefe/src/project/project.dart';
  import 'package:jefe/src/project_commands/project_command.dart';
  import 'package:logging/logging.dart';
  import 'package:jefe/src/project/jefe_project.dart';
  import 'dart:async';
  
  Logger _log = new Logger('jefe.project.commands.git.impl');
  
  
negative.code:   final JefeProject _project;
    GitCommandsImpl(this._project);
  
    Future commit(String message) => executeTask(
        'git commit', () async => gitCommit(await _project.gitDir, message));
  
    Future push() =>
        executeTask('git push', () async => gitPush(await _project.gitDir));
  
    Future fetch() => executeTask('git fetch', () async {
          await gitFetch(await _project.gitDir);
        });
  
    Future assertWorkingTreeClean() =>
        executeTask('git assertWorkingTreeClean', () async {
          if (!await (await _project.gitDir).isWorkingTreeClean()) {
            throw new StateError(
                'working directory dirty for project ${_project.name}');
          }
        });
  
    Future assertOnBranch(String branchName) =>
        executeTask('git assertOnBranch $branchName', () async {
          var currentBranchName =
              (await (await _project.gitDir).getCurrentBranch()).branchName;
          if (currentBranchName != branchName) {
  