在Git上将一组提交折叠为一组

在Git上将一组提交折叠为一组,git,Git,我有做大量小承诺的习惯,我对此很满意。但我希望,不时地,将一堆线性提交合并为一个提交,并能够编写新的提交消息 我查看了文档,但对我来说似乎有点神秘。有人知道怎么做吗?您可以使用 git rebase --interactive <commit> git-rebase——交互式 假设您想重写树的历史记录,直到(但不包括)提交a739b0d export EDITOR=vim # or your favorite editor git rebase a739b0d --interact

我有做大量小承诺的习惯,我对此很满意。但我希望,不时地,将一堆线性提交合并为一个提交,并能够编写新的提交消息


我查看了文档,但对我来说似乎有点神秘。有人知道怎么做吗?

您可以使用

git rebase --interactive <commit>
git-rebase——交互式

假设您想重写树的历史记录,直到(但不包括)提交
a739b0d

export EDITOR=vim # or your favorite editor
git rebase a739b0d --interactive

请务必首先阅读。

使用命令
git-rebase-i
,其中
是最后一次稳定提交的SHA


这会将您带到编辑器,在那里您可以替换每个提交旁边的标签
pick
,因为您将
作为交互式rebase命令的参数包括在内。在要开始折叠的命令上,将
pick
替换为
reword
,对于此后要折叠为它的每个提交,将
pick
替换为
fixup
。保存,然后允许您提供新的提交消息。

如果您不想保留任何现有的提交消息,那么您可以使用一个漂亮(快速)的git配方。首先,确保您的分支已签出:

git checkout <branch-to-squash>
接下来,将分支头移回上一次正确的提交(不修改工作区或索引)。编辑:最后一次好的提交是您希望保留的分支上的最近一次提交

这种方法非常适合合并冗长、复杂的git历史和复杂的合并。此外,没有需要解决的合并/重新设置基础冲突

现在,如果您需要保留任何现有的提交消息或执行任何比上述允许的更高级的操作,那么您需要使用
git-rebase--interactive

解决方案来源于:

参考:


参考资料:

看看这个问题和答案,Git让另一个简单的任务变得很难完成……但让我们说,我想要“重新基化”的提交方式已经过去了,在一系列合并和分支之前。。。这仍然有效吗?是的。您可以在重设基础时首先对提交重新排序,以便要挤压在一起的提交在所有合并之后按顺序排列。然后你可以将这些提交合并为一个提交。你的链接没有针对我的任何地方。是重定基址页面;有更多的概述。这个ReBASE也最终节省了磁盘空间吗?@ cMcDrangoJo.No,在提交之前和之后都存储在您的ReFug中。当您或您的一些合作者已经在Github中推进您的存储库时,考虑这种情况是很重要的。请看,这是一个有效的观点,但由于
-i
--interactive
相同,唯一的区别是
推送
。嗯,是的。但我评论说,只是为了澄清,如果你在重基之前已经推到master,这个推必须通过--force来完成,对吧?。如果你的另一个合作者做了推送,你根本不应该做一个重基。这就是为什么你在一个单独的分支上做你的重基,你把你的重基合并到Master中这是一个很好的答案-有310个提交要挤压,似乎每一个提交都会引入重基错误。“使用你的方法是快速、无痛且正确的。”马塞洛梅森问得好。请将“最后一次良好提交”解释为“您希望保留的分支上最近的提交”。例如,如果您希望将主题分支的历史一直压缩到它与主分支不同的位置,那么最后一次良好提交将是主分支和您的主题分支的
合并基础。如果您的分支上有十个提交,并且只想合并前五个,那么最后一个好的提交应该是
HEAD~5
。这是一种有用的技术,但我建议如下:确保存储库从您的硬件(例如,在Github)备份,并从“到挤压的分支”创建一个全新的分支。这种方法的另一个好处是,如果不需要,您可以轻松地重置部分更改集。通过事先执行
git checkout-b my_squashed_branch
也可以轻松地对新分支执行挤压。在折叠提交后,可以使用
git push-f
将更改推送到远程。
git tag my-branch-backup
git reset --soft <last-good-commit>
git commit