我正在尝试使用JGit lib以编程的方式找到两个提交之间的差异。
假设我有以下提交层次结构:
---1---2---3---4---5---6---7---8--
\--9-—10—-11--/
现在假设我正在分析提交4-7之间的差异,diff命令将如何引用6中的合并?它是否保存与先前提交相关的信息(在4之前),如2?
我使用以下代码来确定差异:
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要老得多,我怀疑是因为合并/重基历史而得到的,但是我不太理解它,所以我可以自己解释。
感谢您在理解差异分析逻辑方面的帮助。
发布于 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的结果。
https://stackoverflow.com/questions/39723315
复制相似问题