在你自己的代码库或当你向其他项目贡献代码时,你最好保持一个清晰的提交记录,至少也要足够清晰以免把你自己搞乱。其中一个重要的方面就是在适当的时候“合并(squashing)”提交记录来形成一个单个的提交记录。这是一个有点争议的话题,因为将多个提交合并成一个会使得二分查找(bisecting)更见困难,但是对于一些小的修改,这往往会有助于提交记录的清晰。举例来说,如过某个人向你的项目中发送了一个pull-request来修复一个bug,但是这个pull-request包含3个提交记录,如下所示。你很可能不会关心最上面和最下面的那两个提交记录,你可能只需要一个包括了test和fix在内的提交,这可以更容易的恢复(revert),更容易的在你的主分支中进行浏览,只要聚焦于这些修改,也同样容易进行二分查找(bisect)- fix typo- fix something. Closes #123- add test for fixing something 你真正想要的是:- fix something. Closes #123 你可以使用 git-extras 中的 git-squash(1) 命令来实现它,尽管我相信某一个GIT大神会给出一个内建(build-in)的解决方案。EDIT: @defunctzombie 建议只需简单的使用 reset —soft,之后再重新提交修改即可。这种方法和git-squash(1)之间的唯一区别是后者会合并(squash)整个分支(要小心!!)。EDIT 2: 最终发现git-merge 有一个--squash 选项可以有效的完成git-squash的工作,所以没有必要再多做介绍如何使用了。下面是它的用户手册的一个片段: —squash, —no-squash Produce the working tree and index state as if a real merge happened (except for the merge information), but do not actually make a commit or move the HEAD, nor record $GIT_DIR/MERGE_HEAD to cause the next git commit command to create a merge commit. This allows you to create a single commit on top of the current branch whose effect is the same as merging another branch (or more in case of an octopus).
短暂的分支
对于一些我确定我会合并的短暂分支来说,在提交时,我会去掉功能相关的前缀。例如,在一个名为 fix/facebook-auth 的分支中有两个常规的提交“fix facebook oauth integration” 和 “add test for facebook oauth integration bug”, 我通常只会像这样提交,"add test",“fix integration”,这样它们依旧有意义,但是这可以为你节省很多时间。