假设我有一个看起来如下的存储库:
/--X---Y----Z---\
A----B----C---D---E-------F-----G---
我的问题是我是否可以“合并”合并提交,以便存储库像这样:
A----B----C---D---E-------F+(X,Y,Z)-----G----H-----I----
或者
A----B----C---D---E-------Q-----G----H-----I----
如果这样会更容易。
编辑:我想将存储库的历史记录线性化,但是我想以编程方式编写它(不知何故),因为repo很大(我们谈论的是提交者)我只是可以' trebase -i
它。
答案 0 :(得分:1)
这可以使用git rebase --onto
并使用显式,目标和源参数来完成:
git branch branch-to-insert Z
git branch branch-following-insert I # or preferably use the actual branch
# name instead of "I"
git rebase --onto E B branch-to-insert # rebase commits from (not including)
# B, e.g. X, Y and Z
git rebase --onto branch-to-insert F branch-following-insert # rebase G..I
这应该给你一个分支
A----B----C----D----E----X----Y----Z----G----H----I----
在命令之后获得树的完整图片:
/--X---Y----Z---\
A----B----C---D---E-------F-----G----H----I----
\---X---Y---Z---G---H---I---
^ ^
| branch-following-insert
branch-to-insert
答案 1 :(得分:0)
我认为您正在寻找的是rebase
命令。这允许您避免使用合并并创建线性历史记录。基本上,此命令允许您获取在一个分支上提交的所有更改,并在另一个分支上重播它们。阅读更多相关信息here。
但是,如果您尚未完成合并,那么正常的rebase工作流程将仅适用于您。从您的问题来看,您似乎已经找到了重写历史的方法。然后我建议调查交互式变基,这正是如此。您可以更改多个提交消息,重新排序提交,压缩提交和拆分提交。阅读更多相关信息here。
修改后更新:也许请查看filter-branch
选项。我个人从未使用它,但它似乎正是你正在寻找的。来自Git's documentation:
“如果您需要以某种可编写脚本的方式重写大量提交,还可以使用另一个历史记录重写选项”