如何使用JGit查看本地工作区未提交文件与HEAD的差异?
使用JGit对比未提交文件与HEAD的差异
两种常见场景的实现代码
1. 对比工作区文件与HEAD的差异
这种场景会显示所有已修改但未暂存的文件变更:
try (Git git = Git.open(new File("/your/repository/path"))) { // 获取HEAD对应的树对象 ObjectId headTreeId = git.getRepository().resolve("HEAD^{tree}"); // 初始化DiffCommand,基准为HEAD树,目标为工作区(null代表工作区) Iterable<DiffEntry> diffEntries = git.diff() .setOldTree(CanonicalTreeParser.create(git.getRepository().newObjectReader(), headTreeId)) .setNewTree(null) .call(); // 遍历并输出差异详情 for (DiffEntry entry : diffEntries) { System.out.println("文件路径: " + entry.getNewPath()); System.out.println("变更类型: " + entry.getChangeType()); // 使用DiffFormatter输出具体行变更 try (DiffFormatter diffFormatter = new DiffFormatter(System.out)) { diffFormatter.setRepository(git.getRepository()); diffFormatter.format(entry); } } } catch (IOException | GitAPIException e) { e.printStackTrace(); }
2. 对比暂存区(索引)与HEAD的差异
这种场景会显示已暂存但未提交的文件变更:
try (Git git = Git.open(new File("/your/repository/path"))) { ObjectId headTreeId = git.getRepository().resolve("HEAD^{tree}"); // 获取暂存区对应的树对象 ObjectId indexTreeId = git.getRepository().resolve("HEAD:"); // 初始化DiffCommand,基准为HEAD树,目标为暂存区树 Iterable<DiffEntry> diffEntries = git.diff() .setOldTree(CanonicalTreeParser.create(git.getRepository().newObjectReader(), headTreeId)) .setNewTree(CanonicalTreeParser.create(git.getRepository().newObjectReader(), indexTreeId)) .call(); // 遍历并输出差异详情 for (DiffEntry entry : diffEntries) { System.out.println("文件路径: " + entry.getNewPath()); System.out.println("变更类型: " + entry.getChangeType()); try (DiffFormatter diffFormatter = new DiffFormatter(System.out)) { diffFormatter.setRepository(git.getRepository()); diffFormatter.format(entry); } } } catch (IOException | GitAPIException e) { e.printStackTrace(); }
关键说明
setOldTree:指定对比的基准版本,这里传入HEAD对应的树对象setNewTree:指定对比的目标版本,null代表工作区,传入索引树对象则代表暂存区DiffFormatter:用于格式化输出具体的行级变更内容,可根据需求调整输出目标(如写入文件而非控制台)
内容的提问来源于stack exchange,提问作者chineseboy
相关产品推荐
相关产品推荐

