title: File diff against the last commit with JGit
body: <p>I am trying to use JGit to get the differences of a file from the last commit to the most recent uncommitted changes. How can I do this with JGit? (using the command line would be the output of <code>git diff HEAD</code>)</p>
  
  <p>Following several discussions (<a href="https://stackoverflow.com/questions/6861881/jgit-cannot-find-a-tutorial-or-simple-example">link1</a>, <a href="https://github.com/centic9/jgit-cookbook/blob/master/src/main/java/org/dstadler/jgit/porcelain/ShowFileDiff.java" rel="nofollow noreferrer">link2</a>) I come with a piece of code that is able to find the files that are uncommited, but it I cannot get the difference of the files</p>
  
  <pre><code>Repository db = new FileRepository("/path/to/git");
  Git git = new Git(db);
  
  AbstractTreeIterator oldTreeParser = this.prepareTreeParser(db, Constants.HEAD);
  
  List&lt;DiffEntry&gt; diff = git.diff().setOldTree(oldTreeParser).call();
  
  for (DiffEntry entry : diff) {
      System.out.println("Entry: " + entry + ", from: " + entry.getOldId() + ", to: " + entry.getNewId());
      DiffFormatter formatter = new DiffFormatter(System.out);
      formatter.setRepository(db);
      formatter.format(entry);
  
  }
  </code></pre>
  
  <p><strong>UPDATE</strong></p>
  
  <p>This issue was a long time ago. My existing for does display the uncommitted code. The current code that I am using for <code>prepareTreeParser</code>, in the context of displaying the difference, is:</p>
  
  <pre><code>public void gitDiff() throws Exception {
      Repository db = new FileRepository("/path/to/git" + DEFAULT_GIT);
      Git git = new Git(db);
  
      ByteArrayOutputStream out = new ByteArrayOutputStream();
      DiffFormatter formatter = new DiffFormatter( out );
      formatter.setRepository(git.getRepository());
      AbstractTreeIterator commitTreeIterator = prepareTreeParser(git.getRepository(), Constants.HEAD);
      FileTreeIterator workTreeIterator = new FileTreeIterator( git.getRepository() );
      List&lt;DiffEntry&gt; diffEntries = formatter.scan( commitTreeIterator, workTreeIterator );
  
      for( DiffEntry entry : diffEntries ) {
          System.out.println("DIFF Entry: " + entry + ", from: " + entry.getOldId() + ", to: " + entry.getNewId());
          formatter.format(entry);
          String diffText = out.toString("UTF-8");
          System.out.println(diffText);
          out.reset();
      }
      git.close();
      db.close();
  
      // This code is untested. It is slighting different for the code I am using in production,
      // but it should be very easy to adapt it for your needs
  }
  private static AbstractTreeIterator prepareTreeParser(Repository repository, String ref) throws Exception {
      Ref head = repository.getRef(ref);
      RevWalk walk = new RevWalk(repository);
      RevCommit commit = walk.parseCommit(head.getObjectId());
      RevTree tree = walk.parseTree(commit.getTree().getId());
  
      CanonicalTreeParser oldTreeParser = new CanonicalTreeParser();
      ObjectReader oldReader = repository.newObjectReader();
      try {
          oldTreeParser.reset(oldReader, tree.getId());
      } finally {
          oldReader.release();
      }
      return oldTreeParser;
  }
  </code></pre>