在工作中我们压缩特征分支而不是合并它们以保持release
分支清除并与feature
分支断开连接。
我们目前正在这样做:
git checkout release
git merge --squash feature
git commit -m 'Squashed Feature 123'
但是由于一些后端自动化系统要求,我们想知道功能中的哪些sha创建了壁球提交而没有合并和而没有修改功能分支
自动化的目标是告诉管理层feature
已被压缩为release
(无论冲突及其解决方案)。这样做的唯一一致方式是以某种方式"注册" feature
HEAD进入壁球提交。如果开发人员将更多提交推送到feature
,则自动化系统会将其标记为" unsquashed"再次,因为feature
HEAD现在指向一个尚未被压扁的sha。
我找到了3种可以标记壁球提交的方法,以便自动化系统可以将feature
识别为压缩到release
,但没有一种令人满意:
1)git merge -Xours feature
将创建一个额外的提交,用于向自动化系统指示合并到feature
的{{1}} sha。但是现在我们有2个提交加上整个历史就像合并一样,所以不是解决方案,因为我们不想要release
历史记录。
feature
会使git replace --graft release release~1 feature
成为feature
的祖先。这也有效,但就像1),这将带来历史,我们想要避免,所以不是解决方案。
3)release
字符串可以标记自动化系统,壁球提交实际上是来自某个提交的合并。这可能是一个解决方案....问题是正确地提交提交消息凌乱且容易出错。
有关如何以一种既可以自动解析的方式实现这一目标的任何见解,也足以让用户在其合并工作流程中实现这一点?
现在,我们不必使用git commit -m 'squashed from [SHA=$feature_squashed_sha]'
,如果它以一致的方式将壁球指向其原始的sha,则欢迎任何其他不可合并的方法
此外,自动化系统可以配置为运行任何命令,只要它给出问题的答案 git merge --squash
HEAD被压扁到feature
?
答案 0 :(得分:1)
怎么样......
git checkout release
git checkout -b feature-123-abcd1234
git merge --squash feature-123
git checkout release
git merge --no-ff feature -123-abcd1234
显然,这最终会再次合并,但它们可能是微不足道的,可以被允许吗?
另一个解决方案是将压缩的SHA存储在存储库本身的增长文本文件中。
最后,您可以在每次压缩时简单地标记要素分支......
答案 1 :(得分:0)
您选择的工作流程似乎有些奇怪。假设您在feature
上有三次提交想要压缩release
- 为什么不这样做
git checkout feature
git rebase release
git rebase --interactive HEAD~3 # (squash the latest two commits into the third)
git checkout release
git merge release # (fast-forward merge to keep commit history clean)
git checkout -
...continue working on feature...
这样,您可以避免合并提交。上面对我来说似乎等同于你正在做的事情,除了简单的git log release..feature
足以告诉你哪些提交还没有被压缩到release
。
毕竟,git merge --squash
的精神是将杀掉 feature
,并将其整合到release
中。你试图做的事情更接近于变革。
如果您已与git merge --squash
工作流程结合,请创建lightweight tag并让开发人员在挤压合并之前运行git tag -a squashed
。
(免责声明:我对git来说相对较新。)