2012-02-01 59 views
9

我有提交的线性历史上的一个简单的存储库,如:如何在无关分支之上重新应用提交?

[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工具中清楚地看到这些提交。
+0

我想你应该看看git cherry-pick。 – 2012-02-01 02:22:41

+0

你有没有想过如何保持日期变化? – thinsoldier 2014-06-20 17:40:25

回答

15

不知道为什么你需要提交日期保持不变,但这里有云:

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> 

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

您也可以通过在原有的库从A基础重建和挤压B到它做同样的事情(尽管提交日期将不会被保留):

git rebase -i `A` 

# change "pick b" to "squash b" 

你会得到一个机会来改变承诺消息,在这一点上,你可以使它成为X的。

+0

这听起来像是迄今为止最好的方法,但是,我有一个问题,使用'git fetch'获取提交。我如何参考他们?他们不在任何分支上,是吗? – Borek 2012-02-01 12:56:28

+2

'git fetch'将为您创建一个名为'FETCH_HEAD'的便利分支,该分支将指向您旧仓库中的任何“HEAD”(即任何已签出)。而且,跨存储库的commit-id将完全相同,所以你可以直接去'git log '。您也可以选择在抓取过程中创建相应的分支:'git fetch their_branch:my_branch'。 – antak 2012-02-02 01:00:56

3

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

git cherry-pick C D E 

而X是你的头应该这样做。

+0

谢谢,我认为rebase会成为我的朋友,但cherry pick是使用的命令。我希望我可以指定像“C ..”这样的提交,因为我在原始回购中有数百个提交。 – Borek 2012-02-01 02:32:15

+0

如果你有很多,有一些樱桃选项,可以让你分组。检查文档。 Rebase也会起作用 - 如果您在原始存储库上使用它来将A和B替换为X,则最终会得到与您要查找的结果相同的结果。 – 2012-02-01 02:36:06

+1

樱桃挑选似乎失去了提交日期信息(它可能会创建一个新的提交),这个问题是否与rebase一样?这将是非常糟糕的,我需要维护提交日期。 – Borek 2012-02-01 02:42:10

1

你说你创建了“一个新的存储库”。你可能不想这样做。如果出于某种原因,您的存储库中的提交A和B必须完全停止存在(例如,出于法律方面的原因,或者因为您意外地提交了信用卡号码和您的秘密食谱),您需要阅读如何永久删除提交。但首先让我们来修复树的其余部分。

试着这么做

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假设他们很好地融合到十

+0

这是正确的,A和B必须从历史中完全删除,所以创建一个新的回购似乎是一个很好的开始。我创建了一个状态X,获取远程分支original-repo/master,现在我可以从它挑选提交到主分支。我有两个问题:1)樱桃挑选的提交失去日期2)我不能引用原始回购/主分支(因为它没有任何与当地主人共同的父母,我站在我的'主'旁边)。我无法删除我从樱桃采摘的那个临时分支。 – Borek 2012-02-01 02:55:06

+1

你不需要一个新的回购来完全删除提交。例如,您可以使用rebase来消除提交。唯一的问题是,如果你有法律上的理由或者某些东西需要移除提交,那么你必须确保当你移除提交时变成垃圾的对象会被清理掉,这样对于那些知道他们在做什么的人来说它们仍然不可用。当然,你必须到处回购每个回购克隆,并做同样的事情,否则你可能不履行法定义务。 – bames53 2012-02-01 05:17:21

+0

A和X没有任何共同的提交,是否有可能创建一个在我的原始回购中没有父项的分支? – Borek 2012-02-01 10:28:37