如何在不相关的分支上重新提交提交?

时间:2012-02-01 02:20:53

标签: git

我有一个简单的存储库,其中包含线性的提交历史记录,例如:

[A] -> [B] -> [C] -> [D] -> [E] ...

我基本上需要删除提交A和B,所以我想我会创建一个新的存储库并希望实现类似的东西:

[X] -> [C] -> [D] -> [E] ...

所以我创建了一个新的存储库,手动创建了提交X,它从A和B获取存储相关信息,现在需要一个命令,它将从原始存储库中提交C,D,E等提交,并将其置于顶层我的新提交X。

怎么做?

编辑:我对建议的挑选方法有两个问题:

  1. 转移的提交丢失了日期。有没有办法保留提交日期?
  2. 当我从原始存储库中获取master时(并且该远程主服务器没有与新存储库相同的任何提交),我无法删除这些提取的提交。当我git branch -D myoriginalrepo/master时,它表示没有这样的分支,而我可以在GUI工具中清楚地看到这些提交。

3 个答案:

答案 0 :(得分:16)

不确定为什么你需要提交日期保持不变但是这里:

git rebase B E --onto X --committer-date-is-author-date

如果B..EX在同一个存储库中(因为它们可以是if you create your fresh start in-place),则您需要先获取它们:

git fetch <path_to_old_repos>

当然,BEX在这里指的是如果您实际上没有标记/分支它们的提交ID。

您也可以通过从原始存储库中的A重新定位并将B压缩到其上来执行类似的操作(尽管提交日期不会被保留):

git rebase -i `A`

# change "pick b" to "squash b"

您将有机会更改提交消息,此时您可以将其设为X

答案 1 :(得分:3)

您可以使用git cherry-pick。在你的情况下:

git cherry-pick C D E

虽然X是你的头,但应该这样做。

答案 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上。