我的项目以原型开始,然后我在其上开发了一个实际的解决方案。这项工作是顺序的,即每个新的开发分支都是在完成一个功能后重新合并为master(然后删除) - 所以我有一个很好的线性历史。现在我注意到原型本身可能很有用,我想从这个存储库中提取它并创建一个新的。
为了更好地说明我的观点,这里是我的历史现在的样子(让我们说TAG
表示原型开始成为解决方案时历史上任意选择的点):
current repo: (ROOT)-----(commits)-----(TAG)--------(commits)---(HEAD)
这就是我希望它的样子:
current repo: (ROOT)-----(commits)-----(TAG)--------(commits)---(HEAD)
new repo: (ROOT)-----(commits)-----(TAG == HEAD)
附带问题:是否可以将它们完全拆分,使它们看起来像这样:
current repo: (TAG == ROOT)----(commits)-----(HEAD)
new repo: (ROOT)-----------(commits)-----(TAG == HEAD)
答案 0 :(得分:1)
你可以做任何你想做的事。对于“原型”回购,我首先要创建一个“镜像”克隆
git clone --mirror url/to/old/repo/origin
使repo的原型版本非常简单。您必须将master
移回标记最后原型版本的TAG
。您必须找到该提交。假设其SHA值为ABC123
;然后
git reset --hard ABC123
如果您有来自最近历史记录的任何其他标记或分支,您可能希望删除它们。但既然你说这是一个简单的线性历史,那就不应该那么多了。然后你可以根据需要清理它。有几种方法;我经常和
一起去rm -r .git/logs
git gc --aggressive --prune=now
现在这是你的原型回购。这可以让你看到第一张照片。
现在,如果您还想从“解决方案”仓库中删除原型历史记录, 我将从一个新的克隆开始。如果这将替换原始仓库,普通克隆就可以了;如果您使用它来启动新的回购,我再次建议使用镜像克隆。
从那里开始,有很多方法可以做到,但
怎么样git rebase -i --root
每个提交弹出一个编辑器。留下第一个。将第一次提交的第一个单词更改为(并包括)第一个“解决方案”提交到squash
,然后保存并退出编辑器。
经过一些工作后,会出现一个新的编辑器,显示来自压缩提交的组合提交消息。根据需要进行显示,保存并退出。
如果这是一个普通的克隆并且您正在替换原始的repo,那么现在强制将master ref推回原点。请注意,这是一个上游rebase,使用repo的任何其他人都必须从中恢复。 (参见git rebase
文档。)