如果我有一个单亲提交的分支;如何从这个分支中选择一个连续的提交区域,并将它们的壁球添加到另一个分支?我不想更改原始分支(并假设每个提交只有一个父级)。
以下是一个示例:我想选择C
,D
和E
,将它们压扁,然后将它们放到Z
上。然后选择F
和G
,压缩它们,并将它们放在Z
的头部。我们从下面的树开始:
A-----B------C------D------E------F------G------H
\
\
Z
并获得此结果:
A-----B------C------D------E------F------G------H
\
\
Z------Y------X
其中:
Y
是C
,D
和E
X
是F
和G
的压缩提交。
我想避免以下中间结果:
A-----B------C------D------E------F------G------H
\
\
Z------C------D------E------F------G
在JGit中有直接的方法吗?我一直在关注MergeCommand
,CherryPickCommand
和RebaseCommand
,但我不确定如何在避免中间结果的同时执行此操作。我也找不到很多JGit示例。任何的意见都将会有帮助。
答案 0 :(得分:3)
我找到了使用CherryPickCommand
和RebaseCommand
的解决方案。使用上面的示例,我切换到Z
处的分支。
A-----B------C------D------E------F------G------H
\
\
Z
然后,我为每次提交选择使用C
的RevCommits D
,E
和.include(RevCommit)
。然后我使用.call()
将提交添加到我的新分支,结果如下图所示:
A-----B------C------D------E------F------G------H
\
\
Z------C------D------E
接下来,我将C
,D
和E
压缩到一个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的压缩提交
那就是它!
要完成示例,我会对提交F
和G
执行相同的操作。
如果有一个直接的方法来一次性添加和压缩提交,我会非常感兴趣。目前,这可以避免重复整个分支。