gpt4 book ai didi

git - JGit:如何选择和压缩从一个分支到另一个分支的提交区域

转载 作者:太空狗 更新时间:2023-10-29 14:46:43 25 4
gpt4 key购买 nike

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

这是一个例子:我想选择 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 示例。任何的意见都将会有帮助。

最佳答案

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

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

然后,我使用 .include(RevCommit) 挑选 RevCommits CDE对于每个提交。然后我使用 .call() 将提交添加到我的新分支,结果如下图所示:

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

接下来,我使用 RebaseCommandCDE 压缩到一个提交中。首先,我使用 .setUpstream("HEAD~3") 设置上游 commi 以移回 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 操作中看到的交互式命令行提示符提供了说明。现在,我的 repo 看起来如下:

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

地点:

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

就是这样!

为了完成示例,我将对提交 FG 执行相同的操作。

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

关于git - JGit:如何选择和压缩从一个分支到另一个分支的提交区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22925813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com