将大量的git提交到一个?

时间:2018-05-29 09:22:53

标签: git

有没有办法将Git分支中的大量提交压缩成一个?我知道你可以git rebase -i,但麻烦的是分支的历史记录可能有10,000次提交,而交互式rebase会给我一个huuuuge文件,列出所有提交。我只想说"将所有从x到y的提交压缩成一个"。我想将分支历史中超过6个月的所有提交压缩为一个。

2 个答案:

答案 0 :(得分:2)

假设分支是master

如果x是根提交,

git checkout --orphan tmp y
git commit
git rebase --onto tmp y master
git branch -D tmp

如果x不是根提交,

git checkout y
git reset x --soft
git commit
git rebase --onto HEAD y master

答案 1 :(得分:1)

如果您的意思是只需要6个月的历史记录,那么您可能需要考虑使用浅层克隆。请参阅--shallow-sincehttps://git-scm.com/docs/git-clone)的git clone选项。

这保留了提交的标识,因此即使与共享源存储库一起使用也不太可能导致中断。它还为您提供了将更深层历史记录保存在原点或存档库中的选项。再次因为保留了提交标识,如果需要将来的故障排除或其他任何问题,您可以轻松地将具有深层历史记录的浅层仓库所做的任何新工作移植。

另一种方法是进行历史重写,创建一个新提交来代替一系列旧提交。如果共享存储库,这将“破坏”其他人的存储库。您需要与他们协调以确保他们以正确的方式“修复”他们的回购,否则他们可能会撤消您的重写。请参阅git rebase文档(https://git-scm.com/docs/git-rebase)中的“从上游Rebase恢复”,因为无论您如何进行重写,这都是适用的情况。

只要你的历史是严格线性的,ElpieKay建议的程序就会起作用,但这可能很耗时。如果有多个分支,或者您保留的历史记录部分包含合并,那么很多就不那么简单了。

更常用的解决方案是将git filter-branch--parent-filter一起使用。鉴于像

这样的历史
... x -- O -- O -- O -- y ...

并希望将其缩小为

... xTHRUy ...

(其中xTHRUy是单个提交)你可以这样做:

export NEW_PARENTS=$(git show --format='%P' --no-patch) x
export OLD_PARENTS=$(git show --format='%P' --no-patch) y

其中xy是解析为相应提交的表达式。如果你碰巧知道正确提交的“路径”,这可能是提交ID,或类似master~137之类的东西。然后

git filter-branch --parent-filter "sed \"s/$OLD_PARENTS/$NEW_PARENTS/\"" -- --all