JGit:如何从一个分支到另一个分支挑选和压缩提交区域

时间:2014-04-08 01:05:27

标签: git merge jgit

如果我有一个单亲提交的分支;如何从这个分支中选择一个连续的提交区域,并将它们的壁球添加到另一个分支?我不想更改原始分支(并假设每个提交只有一个父级)。

以下是一个示例:我想选择CDE,将它们压扁,然后将它们放到Z上。然后选择FG,压缩它们,并将它们放在Z的头部。我们从下面的树开始:

A-----B------C------D------E------F------G------H
 \
  \
   Z

并获得此结果:

A-----B------C------D------E------F------G------H
 \
  \
   Z------Y------X

其中:

YCDE

的压缩提交

XFG的压缩提交。

我想避免以下中间结果:

A-----B------C------D------E------F------G------H
 \
  \
   Z------C------D------E------F------G

在JGit中有直接的方法吗?我一直在关注MergeCommandCherryPickCommandRebaseCommand,但我不确定如何在避免中间结果的同时执行此操作。我也找不到很多JGit示例。任何的意见都将会有帮助。

1 个答案:

答案 0 :(得分:3)

我找到了使用CherryPickCommandRebaseCommand的解决方案。使用上面的示例,我切换到Z处的分支。

A-----B------C------D------E------F------G------H
 \
  \
   Z

然后,我为每次提交选择使用C的RevCommits DE.include(RevCommit)。然后我使用.call()将提交添加到我的新分支,结果如下图所示:

A-----B------C------D------E------F------G------H
 \
  \
   Z------C------D------E

接下来,我将CDE压缩到一个RebaseCommand的提交中。首先,我将上游commi设置为.setUpstream("HEAD~3")以返回3次提交。然后我使用如下所示的回调函数运行交互式处理程序:

runInteractively(new InteractiveHandler() {
                    @Override
                    public String modifyCommitMessage(String commit)
                    {
                        return rebaseMessage;
                    }
                    @Override
                    public void prepareSteps(List<RebaseTodoLine> steps)
                    {
                        try
                        {
                            steps.get(0).setAction(RebaseTodoLine.Action.PICK);
                            for (int j = 1; j < steps.size(); j++)
                            {
                                RebaseTodoLine step = steps.get(j); 
                                step.setAction(RebaseTodoLine.Action.SQUASH);
                            }
                        }
                        catch (IllegalTodoFileModification e)
                        {
                            System.out.println("Cannot prepare step: " + e);
                            e.printStackTrace();
                        }
                    }
                });

这有效地为您在正常的git rebase操作中看到的交互式命令行提示提供了说明。现在,我的回购看起来如下:

A-----B------C------D------E------F------G------H
 \
  \
   Z------Y

其中:

Y是C,D和E的压缩提交

那就是它!

要完成示例,我会对提交FG执行相同的操作。

如果有一个直接的方法来一次性添加和压缩提交,我会非常感兴趣。目前,这可以避免重复整个分支。