2017-08-10 113 views
1

我有SVN历史约20000个提交。我搬到了Git并保留了历史。现在我在26000个提交,我想从压扁1中所有提交至20000压扁多个历史提交

  • 初始承诺:a4f5d18
  • 迁移到Git的方法:5a42d81
  • HEAD:933eff

我尝试检查出20000,重订基期:

git checkout 5a42d81 
git rebase squash a4f5d18 

,但我得到:

fatal: Needed a single revision 
invalid upstream squash 

回答

1

如果我理解正确的话,你的主要分支的样子:

master: 1 -> 2 -> 3 -> .. -> 20000 -> A (First non migrated commit) -> B -> C -> ..

你想获得到:

master: 1' (All your migrated commits) -> A' -> B' -> C' -> ..

我想你可以遵循使用git rebase HEAD~26000 (first commit hash probably easier)并将pick更改为squash ,但它可能很费力/费时。

一个潜在可行的解决方案是用你的第一个20000的内容创建一个新的提交。可能值得在备份分支上进行测试。

git checkout <last migrated commit hash> -b backup-master

backup-master: 1 -> 2 -> 3 -> .. -> [20000] -> A (First non migrated commit) -> B -> C -> .. 
             ^- you are here. 

git reset --soft <first migrated commit hash>

backup-master: [1] -> 2 -> 3 -> .. -> 20000 -> A (First non migrated commit) -> B -> C -> .. 
       ^- you are here   ^- the working directory tree/index reflects this commit 

修改您最初提交的内容/消息(或创建一个新的提交如果你愿意)。

git commit --amend

现在backup-master应该包含你压扁的迁移承诺,让我们继续前进的新的提交。

git checkout master

git checkout -b master-rebase(以防万一,我们摆乌龙)。

git rebase backup-master - 我相信这会起作用,因为git知道成功重新绑定所需的合并。如果这个工作,你应该完成,master-rebase将包含你想要的结果。

如果失败,则可能有更好的成功与rebase --onto.

git rebase --onto <destination commit> <parent of first desired commit> <last desired commit>

git rebase --onto backup-master <A>~1 master`的

如果这个作品将放置于您提交当前未在任何分支,所以你需要创建一个:

git checkout -b rebase-success

rebase - 的更全面解释可以找到here

+1

谢谢,这是我一直在寻找的方法,即使实际重新平整速度不会更快,并且与交互式底视图解决方案不同,您无法看到其进展。注意:我必须在软重置后创建分支,因为这会导致分离头部状态。 – Qeebrato

+0

啊,这是一个很好的观点,我忽略了'重置'步骤会让你分开一个头。更新了答案,在初始结账步骤中添加了“-b ”。 – Chris

2

你要多少提交保留,请在下面的命令

git rebase -i HEAD~6000 

该号码或更准确地说

git rebase -i a4f5d18 

保留6000下方提交(皮克)和改变休息的picksquash

如果rebase成功

git log 

你可以看到你所有的提交南瓜一个承诺

,更好地你推更改远程,否则当你再次拉你会看到所有的提交。

git push -f 
+0

OP可以使用'a4f5d18'来代替'HEAD〜6000'。 – 1615903

+0

@ 1615903我没有尝试,可能是有效的 –

+0

@ThiruShetty我试了一下,它的工作原理 – Qeebrato

0

在所有三种情况下(交互式重置,软重置,重新绑定),我遇到了空格问题。 Git有嫁接分支的可能性,它发展成替换功能:

git replace -f 5a42d81 a4f5d18 
git filter-branch