有没有什么办法可以修剪中间的 git 提交?

有没有什么办法可以修剪中间的 git 提交?

希望这是讨论此问题的正确论坛...如果不是,请告诉我。

我是 git 的普通用户,但过去几个月我一直在开发这个应用程序,使用“频繁提交”的原则。所以现在我刚刚运行了git rev-list --all --count,发现我有 425 次提交。

这也许太疯狂了……或者这也许很正常。我不知道。

问题是存储库变得有点难以处理,而在理想情况下我想做的就是浏览提交,从每 3 个提交中消除 2 个:我希望要删除的提交的消息以某种方式添加到要保留的提交的消息中...

有一种“手动”的方法可以做到这一点:我仔细检查整个仓库,检查每 3 次提交,仔细记录我没有保存的提交的文本,并系统地将它们添加到“每第三次”的消息中。

同时,显然,我正在创建一个新的 repo,它只使用那些“每 3 次提交”。我还没有尝试过这个,部分原因是我觉得这有点无聊,而且会花费大量时间:git 中是否有任何东西,或者任何人发明的任何工具,可以帮助完成这类任务?

答案1

为什么

Git 历史在实际讲述开发过程时效果最好。当你最终需要挖掘历史时(例如搜索引入错误的时间、修复错误的时间等),查看标题为“添加今天的更改”;它们会告诉您代码是如何改变的,但没有告诉您为什么改变。

重写提交历史通常会这样做(合并提交、交换提交等等)——但如果你只是随意删除每 3 个提交中的 2 个,它很可能会保留下来同样没用和以前一样。相反,重写历史记录以清理诸如“哎呀,修复拼写错误”之类的内容,或者在提交消息中添加更多详细信息。

当然,以上内容仅供参考,但通常更实用的做法是让计算机记住事情,这样您就不必自己动手了。

对于一个持续数月的项目来说,425 次提交是正常的。与许多现实世界的 Git 存储库(以千为单位测量提交)相比,它也相对较小。如果您担心磁盘空间使用情况,并且 Git 尚未运行定期测试git gc,请尝试手动运行它,看看是否有帮助。

对于通过网络进行备份,git push将比手动上传整个存储库效率更高,因为它确切地知道需要上传什么以及已经存在什么。

回到正题

Git 有许多用于重写历史记录的工具——最常见的是git rebase --interactive,它可以执行您想要的编辑类型。

; on a feature branch, to rewrite everything that's not yet in master
git rebase -i master

; on master, to go through the *entire history*
git rebase -i --root

在交互模式下运行它会在文本编辑器中打开一个“待办事项列表”,每个提交一行,前面有一个“操作”。

  • 移动行将重新排列提交。(但是,更改文本将不会更新提交消息 - 它们只是预览。用于reword编辑真实消息。

  • 将操作从 更改picksquash将会把提交与上面的提交合并 - 从而产生包含两条消息的单个提交。

  • 操作fixup类似,但只保留第一条消息。

这是基础知识,因为已经有大量教程写得更详细了。例如,Git 书籍关于重写历史的一章

相关内容