使用 JGit 中止合并

Posted

技术标签:

【中文标题】使用 JGit 中止合并【英文标题】:Abort merge using JGit 【发布时间】:2015-06-30 16:03:09 【问题描述】:

这很简单:如何模拟命令 git merge --abort 在 JGit 中?我需要在真正合并之前“预览”冲突

【问题讨论】:

【参考方案1】:

在 JGit 中,git merge --abort 没有直接的等价物。这段代码 sn -p 可以作为起点:

// clear the merge state
repository.writeMergeCommitMsg(null);
repository.writeMergeHeads(null);

// reset the index and work directory to HEAD
Git.wrap(repository).reset().setMode(ResetType.HARD).call();

它清空合并状态文件,然后将索引和工作目录重置为当前 HEAD 提交的内容。

为了测试两个提交是否可以合并,您还可以使用 in-core 合并。这样可以避免将冲突的提交检出到工作目录中,以便稍后重置它们。

RevCommit parentCommit = mergeCommit.getParent(0);
revWalk.parseHeaders(parentCommit);

ResolveMerger merger = (ResolveMerger) MergeStrategy.RESOLVE.newMerger(repository, true);
merger.setWorkingTreeIterator(new FileTreeIterator(repository));
merger.setBase(parentCommit.getTree());
if (!merger.merge(headCommit, mergeCommit)) 
  if (merger.failed()) 
    throw new IllegalStateException("Should not happen with in-core mergers");
  
  // inspect merger.getMergeResults() for further details

【讨论】:

“mergeCommit”是 FETCH_HEAD 吗? mergeCommit 是应该合并到 HEAD 中的提交。

以上是关于使用 JGit 中止合并的主要内容,如果未能解决你的问题,请参考以下文章

如何在与 JGit 合并之前获得冲突?

使用 jgit 创建远程和本地分支

在递归合并排序期间中止(核心转储)

如何中止mercurial中的合并?

使用 JGIT 进行浅克隆

Jgit中'pull'命令的使用