首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在JGit中处理合并提交

如何在JGit中处理合并提交
EN

Stack Overflow用户
提问于 2016-09-27 11:20:14
回答 1查看 310关注 0票数 1

我正在尝试使用JGit lib以编程的方式找到两个提交之间的差异。

假设我有以下提交层次结构:

代码语言:javascript
运行
复制
---1---2---3---4---5---6---7---8--
        \--9-—10—-11--/

现在假设我正在分析提交4-7之间的差异,diff命令将如何引用6中的合并?它是否保存与先前提交相关的信息(在4之前),如2?

我使用以下代码来确定差异:

代码语言:javascript
运行
复制
private static List<DiffEntry> getDiffsBetweenCommits(String repositoryWorkDir, String fromCommit, String toCommit) {
    List<DiffEntry> diffs = null;
    try {

        // Access GIT repository
        File workDir = new File(repositoryWorkDir);
        Git git = Git.open(workDir);
        repository =  git.getRepository();

        // Locate commit references
        ObjectId current = repository.resolve(toCommit + "^{tree}");
        ObjectId previous = repository.resolve(fromCommit + "^{tree}");

        // Generate tree iterators
        ObjectReader reader = git.getRepository().newObjectReader();
        CanonicalTreeParser oldTreeIter = new CanonicalTreeParser();
        oldTreeIter.reset(reader, previous);
        CanonicalTreeParser newTreeIter = new CanonicalTreeParser();
        newTreeIter.reset(reader, current);

        // Calculate GIT differences
        diffs = git.diff()
                .setNewTree(newTreeIter)
                .setOldTree(oldTreeIter)
                .call();
    } catch (Exception e) {
        System.out.println("Error analyzing commit's diffs");
        e.printStackTrace();
    }
    return diffs;
}

我在提交中修改的文件比4要老得多,我怀疑是因为合并/重基历史而得到的,但是我不太理解它,所以我可以自己解释。

感谢您在理解差异分析逻辑方面的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-28 08:27:42

您最好重新定义/这个问题,将其放在更一般的Git上下文中。

尽管如此,我对这个主题的了解如下:与其他SCM不同,Git存储提交的全部内容,而不仅仅是父提交的差异。每个提交引用一个所谓的“树”,它列出提交中的所有文件以及指向相应文件内容的指针。

创建提交时,采取其父树,应用所有阶段性更改(添加、修改、删除),并将结果(新的)树与提交元数据一起存储。关于它的内容,每个提交都可以重构,而不需要引用它的父节点。

让我们假设示例中的每个提交都添加了一个唯一的文件。如果您查看提交#6,它包含从1到6的所有文件,再加上9、10、11的文件。因此,“git diff 4 6”将比较提交#4的树和提交#6的树(其中包括到目前为止的所有文件)。

有关Git中存储内部的更多细节,您可能需要阅读本文:http://www.codeaffine.com/2014/10/20/git-internals/文章附带了自带式的学习测试,以检查JGit的结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39723315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档