You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 17:08:26