将一系列提交压缩或删除为一个(超过 54000+ 次提交)

Squash or Remove a range of commits into one (Over 54000+ commits)

我有一个 git 回购协议,我在大约 1.5 年前通过创建一个为我创建提交的机器人进行了测试。我刚开始学习 git,我想通过提交数以千计看起来很酷。

基本上,我所做的是我创建了一个机器人,它向文件添加一行,添加它,提交它,然后推送它。因此,大约 54000+ 次提交毫无价值。我将如何删除所有这些提交?这是个好主意吗?

没有价值的提交,也就是我想要删除的提交,位于中间,从 0c4068fb3 开始到 42b8fae4b 结束。因此,legit 提交在 0c4068fb3 之前和 42b8fae4b 之后。没有价值的提交很容易被检测到。原因是当我创建我的 bot 时,我使用了我所有的提交消息,并将它们放在一个列表中,bot 会随机 select 并将其用于其提交消息。因此,任何重复多次的提交都是没有价值的提交。 此外,大多数没有价值的提交也说 first commit,或类似的东西。

因此,here's link 到伪造开始的提交部分。如您所知,提交消息不断重复。

虚假提交中的实际内容只是一个名为 bot.txt 的文件的增加行。因此,这些提交没有任何价值。

如果没有,您能告诉我如何删除所有 54000 多个提交并只保留真正有价值的提交吗?

谢谢

更新: 在您的特定情况下,由于您希望删除的所有提交都写入名为 bot.txt 的文件,并且 none您希望保留的提交写入该文件,最简单的操作过程是使用 从整个历史记录中删除该单个文件。任何仅触及该文件的提交都将从新的 re-written 存储库中删除。结果将是没有那些 54K 提交的类似回购协议。

上一个答案: 请注意,此答案可能仍然适用于您,但正如所写,下面的答案旨在在线性历史的更一般意义上起作用。通过将选项 --rebase-merges 添加到下面的最终 rebase 命令,您仍然可以在 non-linear 历史记录中实现您的目标。请注意,这里的主要区别是 54K 提交将被压缩到一个提交中,如果这包括在最后一次提交中创建和最终删除文件,最终将创建一个不在回购协议中的提交。

根据评论中的一些信息:

:

For the "ones that actually have value", where do they fall in the history graph? For example, some good commits before the 54k, some good commits mixed in with the 54k, some good commits after the 54k?

And you answered:

The commits that don't have value are in the middle, starting at 0c4068fb3 and ending at 42b8fae4b. So all the commits that have value are before 0c4068fb3 and after 42b8fae4b

如果你的历史是线性的这很简单,使用挤压方法,我可以向你保证不会有冲突。

# Let's assume you are rewriting branch: master

# Back it up for sanity purposes
git branch master-backup master

# create a new branch
git switch -c temp-branch 42b8fae4b # start a branch from last "bad" commit
git reset --soft 0c4068fb3~1 # reset back to commit before first "bad" commit

# Note right now you have only "good" commits on your branch,
#  and all "bad" commit changes are staged, let's make 1 big commit
git commit -m "Squash all automated commits into one"

# now rebase the remaining commits on master
git rebase 42b8fae4b master --onto temp-branch

请注意,删除 错误提交而不是压缩也相当简单,但你不能保证不会有冲突(除非你碰巧知道不会'不会)。