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

Bor*_*ard 10 git

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

[A] -> [B] -> [C] -> [D] -> [E] ...
Run Code Online (Sandbox Code Playgroud)

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

[X] -> [C] -> [D] -> [E] ...
Run Code Online (Sandbox Code Playgroud)

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

怎么做?

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

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

ant*_*tak 16

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

git rebase B E --onto X --committer-date-is-author-date
Run Code Online (Sandbox Code Playgroud)

如果B..E不在同一个存储库中X(如果你在就地创建新的启动它们就可以),你需要先获取它们:

git fetch <path_to_old_repos>
Run Code Online (Sandbox Code Playgroud)

当然,B,EX这里的意思是他们犯下的IDS,如果你还没有真正标记/支它们.

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

git rebase -i `A`

# change "pick b" to "squash b"
Run Code Online (Sandbox Code Playgroud)

您将有机会更改提交消息,此时您可以使用它X.

  • `git fetch`将为您创建一个名为`FETCH_HEAD`的便利分支,它将指向旧存储库中的任何`HEAD`(即已检出的内容).而且,commit-id在存储库中将完全相同,所以你可以去`git log <B的commit-id>`.您也可以选择创建一个相应的分支获取期间:'混帐取<path_to_old_repos> their_branch:my_branch`. (2认同)