我有一个简单的存储库,其中包含线性的提交历史记录,例如:
[A] -> [B] -> [C] -> [D] -> [E] ...
我基本上需要删除提交A和B,所以我想我会创建一个新的存储库并希望实现类似的东西:
[X] -> [C] -> [D] -> [E] ...
所以我创建了一个新的存储库,手动创建了提交X,它从A和B获取存储相关信息,现在需要一个命令,它将从原始存储库中提交C,D,E等提交,并将其置于顶层我的新提交X。
怎么做?
编辑:我对建议的挑选方法有两个问题:
git branch -D myoriginalrepo/master
时,它表示没有这样的分支,而我可以在GUI工具中清楚地看到这些提交。答案 0 :(得分:16)
不确定为什么你需要提交日期保持不变但是这里:
git rebase B E --onto X --committer-date-is-author-date
如果B..E
与X
在同一个存储库中(因为它们可以是if you create your fresh start in-place),则您需要先获取它们:
git fetch <path_to_old_repos>
当然,B
,E
和X
在这里指的是如果您实际上没有标记/分支它们的提交ID。
您也可以通过从原始存储库中的A
重新定位并将B
压缩到其上来执行类似的操作(尽管提交日期不会被保留):
git rebase -i `A`
# change "pick b" to "squash b"
您将有机会更改提交消息,此时您可以将其设为X
。
答案 1 :(得分:3)
答案 2 :(得分:1)
你说你创建了“一个新的存储库”。你可能不想这样做。如果由于某种原因,提交A和B必须完全不再存在(例如出于法律原因或因为您不小心提交了您的信用卡号和您的haggis秘方),您需要阅读有关如何永久删除提交的内容。但首先让我们修复树的其余部分。
尝试类似
的内容git checkout -b freshstart A
# modify the state of the system until it reflects your desired new beginning X
git commit --amend
git cherry-pick C D E
现在你有一个名为freshstart的分支,它有你的新X开头,并提交C,D和E,假设它们很好地合并到X上。