在某些设置中,我习惯在本地使用git,然后导出diff,然后提交详细说明.因此,当我在本地开发时,我会不断提交,并且在提交之前不会打扰有意义的提交消息或完美测试.
但是,当使用git在github上发布代码时,我宁愿删除那些小提交的历史记录,只创建一个表示经过良好测试的逻辑更改的提交.
什么是实现这一目标的最佳方式,只要我觉得我已经探索了一条小路径(无论如何未经证实),而不改变我当地的工作流程?
如果你看一下" 修剪GIT Checkins/Squashing GIT History ",你可以:
git rebase --interactive --fixup为了压缩提交,你可以在a的提交编辑列表中手动重新排序rebase --interactive,同时忽略第二个提交消息,这将使消息编辑步骤更快(你可以保存它:压扁的提交只有第一个提交消息)git rebase --interactive --autosquash为您自动进行提交重新排序过程.这就是为什么我喜欢为每个活动的所有微提交选择标准注释.
第一个微提交将包含"我的活动".
所有其他将包含" squash! my activity"
在此过程中可以交织几个活动(一组微提交).
剩下的就是git rebase --interactive --autosquash为所有那些微提交重新排序然后压扁.
OP namin在博客文章中提到了我们的Git工作流程:私人开发,公开发布作为一个很好的例证,基于git merge --squash:
(也可以看看:
)

我们为每个客户端库维护了3个分支:
master- 在这个分支上进行积极的开发.release- 错误修复的开发发生在这里.我们还会破坏版本并更新此分支上的更改日志.github_master- 我们将发布分支的release提交压缩到此分支上的单个" "提交以及标记版本.这个分支跟踪github/master.我们现在准备转移到github_master分支.
git checkout github_master
Run Code Online (Sandbox Code Playgroud)
我们希望将发布中的更改合并到github_master分支中,但我们不希望看到每个单独的提交.
Git用这个git merge --squash命令帮助我们.这将合并来自特定ref的所有更改,将它们压缩到一组更改中并使更改暂停.我们使用消息"1.0.0"提交阶段性更改并标记提交.
git merge --squash release
git commit -m "1.0.0"
git tag 1.0.0 -m "1.0.0"
Run Code Online (Sandbox Code Playgroud)
随着提交被压扁和标记,是时候推送到github了.
我们想将当前分支的HEAD推送到github远程的主分支.
git push github HEAD:master
Run Code Online (Sandbox Code Playgroud)
最后但并非最不重要的是,我们需要将这些更改推送到原始分支,并将压缩的提交合并到release和master.
您可能会怀疑混帐会混淆合并压扁提交回包含未塌缩提交分支机构,但是它所有的作品一样期待.Git足够聪明,意识到在压缩提交中合并时不需要进行任何更改,但我们仍然应该合并以保持我们的分支同步.
git push origin github_master
git checkout release
git merge github_master
git push origin release
git checkout master
git merge release
git push origin master
Run Code Online (Sandbox Code Playgroud)