压缩多个历史提交
squash multiple historical commits
我有大约 20000 次提交的 SVN 历史记录。我搬到了 Git 并保留了历史记录。现在我有 26000 个提交,我想压缩从 1 到 20000 的所有提交。
- 初始提交:a4f5d18
- 迁移到 git:5a42d81
- 头部:933eff
我尝试检查 20000 并重新定基:
git checkout 5a42d81
git rebase squash a4f5d18
但我得到:
fatal: Needed a single revision
invalid upstream squash
您要保留多少次提交,请在下面的命令中指定该数字
git rebase -i HEAD~6000
或更准确地说
git rebase -i a4f5d18
保留下面的 6000 次提交(作为选择)并将 pick
的其余部分更改为 squash
如果变基成功
git log
您可以看到所有提交都压缩为一个提交
最好将更改推送到远程,否则当您再次拉取时,您将看到所有提交。
git push -f
如果我没理解错的话,你的主分支是这样的:
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
的方法,但这可能会 fiddly/time 消耗。
一个可能可行的解决方案是使用您的第一个 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
修改您的初始提交 contents/message(如果您愿意,也可以创建一个新的提交)。
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
高手`
如果这可行,它会将您置于当前不在任何分支上的提交上,因此您需要创建一个:
git checkout -b rebase-success
。
可以找到关于 rebase --onto 的更详尽的解释 here。
我 运行 在所有三种情况下(交互式变基、软重置、变基到)都遇到了空格问题。 Git有嫁接b运行ches的可能,发展成replace功能:
git replace -f 5a42d81 a4f5d18
git filter-branch
我有大约 20000 次提交的 SVN 历史记录。我搬到了 Git 并保留了历史记录。现在我有 26000 个提交,我想压缩从 1 到 20000 的所有提交。
- 初始提交:a4f5d18
- 迁移到 git:5a42d81
- 头部:933eff
我尝试检查 20000 并重新定基:
git checkout 5a42d81
git rebase squash a4f5d18
但我得到:
fatal: Needed a single revision
invalid upstream squash
您要保留多少次提交,请在下面的命令中指定该数字
git rebase -i HEAD~6000
或更准确地说
git rebase -i a4f5d18
保留下面的 6000 次提交(作为选择)并将 pick
的其余部分更改为 squash
如果变基成功
git log
您可以看到所有提交都压缩为一个提交
最好将更改推送到远程,否则当您再次拉取时,您将看到所有提交。
git push -f
如果我没理解错的话,你的主分支是这样的:
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
的方法,但这可能会 fiddly/time 消耗。
一个可能可行的解决方案是使用您的第一个 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
修改您的初始提交 contents/message(如果您愿意,也可以创建一个新的提交)。
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
高手`
如果这可行,它会将您置于当前不在任何分支上的提交上,因此您需要创建一个:
git checkout -b rebase-success
。
可以找到关于 rebase --onto 的更详尽的解释 here。
我 运行 在所有三种情况下(交互式变基、软重置、变基到)都遇到了空格问题。 Git有嫁接b运行ches的可能,发展成replace功能:
git replace -f 5a42d81 a4f5d18
git filter-branch