Git 将多个提交压缩为更少但更大的提交

Git 将多个提交压缩为更少但更大的提交,git,Git,我每小时都要做每件事。这很好,但我最终有太多的承诺 我希望能够清除此文件,以代替: 1 hour ago 2 hours ago . 23 hours ago 24 hours ago 我只是想: 1 hour ago 2 hours ago 1 day ago 7 days ago 等等 目前我每小时做: git-add . git-commit -a 如何删除某些提交?我不想撤消任何更改。我只是不想有太多的问题需要讨论。我希望在过去的几个小时内有很多提交,但在那之后只有几个(过去的一天

我每小时都要做每件事。这很好,但我最终有太多的承诺

我希望能够清除此文件,以代替:

1 hour ago
2 hours ago
.
23 hours ago
24 hours ago
我只是想:

1 hour ago
2 hours ago
1 day ago
7 days ago
等等

目前我每小时做:

git-add .
git-commit -a

如何删除某些提交?我不想撤消任何更改。我只是不想有太多的问题需要讨论。我希望在过去的几个小时内有很多提交,但在那之后只有几个(过去的一天、一周、一个月等,或者我有意保留的其他要点)。

看看这个命令。这让您可以将提交“挤压”成更大的提交,这似乎是您想要做的。

使用
git-rebase-i
squash
是一种简单的方法。然而,这需要用户交互

如果您一直在这样做,那么您可能需要考虑为自己编写一个git提交钩子(请参阅),或者只编写一个普通脚本,您可以选择在需要时运行它。如果我有更多的时间,我会给你写出来的。似乎值得投入更多的时间为自己实现自动化

要在没有用户交互的情况下实现这一点,您需要避免使用
git-rebase-i
。在这种情况下,您可能正在寻找类似于
git reset--soft
的东西(有关更多信息,请参阅)。如果您将其作为预提交挂钩运行,则可以检查最后一次提交是否在昨天进行(请参阅下文,了解按日期列出提交的信息)。如果最后一次提交是在昨天,这将告诉您将提交折叠为单个提交的时间。一旦您对昨天执行的第一次提交
git reset--soft
,您就可以重新提交所有这些更改。请记住,您必须使用
git commit
--date
选项指定原始编写日期,以便折叠的提交保留其旧日期

从中,您可以根据最初编写提交的日期,创建最近提交的列表以进行解析。例如,下面显示如何创建最后4次提交的列表。我选择了4作为一个例子,您可能希望选择一个数字,以确保您能够看到前几天的所有提交,根据您的回购协议,您可能希望列出所有提交并重新组织您的整个历史记录

git log --format="%H %ar" | head -n 4
输出如下所示:

6c3c5d3970c9f7de9e762f7e8300eaa37db11363 19 hours ago
2e1a8020f59be0cf43500a86033e2acde0707961 2 days ago
9bc3479a257e3f7f9dc9cbb88f3723706369b160 2 days ago
b26353b764cdd3bce0e7f0dec90ea84127c4b292 2 days ago
我不确定如果列表中列出了相对日期或不同的日期格式,那么解析列表是否会更容易


另外,我意识到,如果您将其作为预提交钩子编写,您将不得不暂时
git stash
您当前的工作目录,管理您的历史记录,它们将恢复您所保存的内容

你为什么每小时都在做承诺?您应该在每次逻辑更改后进行提交,然后在完成后重新设置基础,以消除历史上的错误。@mathepic:经常使用git提交是一个很好的实践。正如下面的回答,您可以稍后重新设定提交的基础,这样您就不会有太多的提交。提交通常允许您返回,以防您开始添加小的更改,而这些更改最终导致完全失败。你可以退一步,在更好的时候重新启动。添加…提交逻辑更改,并使用更多基于时间的@Erik提交从来都不是一个好做法。您必须完全重新编辑您的历史记录,而不是仅仅移动和挤压提交。“经常提交”(正如Erik所说)和“每次逻辑更改后提交”(如mathepic所说)不是相互排斥的。您应该尝试以这样一种方式进行编码,即尽可能频繁地到达逻辑更改的末尾,以便您的提交既美观又符合逻辑,而且频繁。也就是说,
git rebase-i
在您需要时很好地提供它。有关如何使用rebase挤压提交的文本版本: