将一系列小提交重新定义为逻辑单元提交

nam*_*min 3 git

在某些设置中,我习惯在本地使用git,然后导出diff,然后提交详细说明.因此,当我在本地开发时,我会不断提交,并且在提交之前不会打扰有意义的提交消息或完美测试.

但是,当使用git在github上发布代码时,我宁愿删除那些小提交的历史记录,只创建一个表示经过良好测试的逻辑更改的提交.

什么是实现这一目标的最佳方式,只要我觉得我已经探索了一条小路径(无论如何未经证实),而不改变我当地的工作流程?

Von*_*onC 5

如果你看一下" 修剪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)