如何知道一个分支是否被压缩成另一个分支

How to know if a branch has been squashed into another

在工作中,我们压缩功能分支而不是合并它们以保持 release 分支干净并与 feature 分支断开连接。

我们目前正在这样做:

git checkout release
git merge --squash feature
git commit -m 'Squashed Feature 123'

但由于某些 后端自动化系统 要求,我们想知道功能中的 sha 创建了 squash 提交 没有合并 不修改功能分支

自动化的目标是告诉管理人员 feature 已被压缩为 release(无论是否存在冲突及其解决方案)。唯一一致的做法是以某种方式 "register" feature HEAD sha 进入 squash 提交。如果开发人员将更多提交推送到 feature,自动化系统会再次将其标记为 "unsquashed",因为 feature HEAD 现在指向一个尚未被压缩的 sha。

我找到了 3 种可以标记压缩提交的方法,以便自动化系统可以将 feature 识别为压缩到 release,但 none 令人满意:

1) git merge -Xours feature 在 squash 之后将创建一个额外的提交,可以用于向自动化系统指示 feature sha 已合并到 release。但是现在我们有 2 次提交加上整个历史就像合并一样,所以 不是解决方案 因为我们不想要 feature 历史。

2) git replace --graft release release~1 feature 压缩后将使 feature 成为 release 的祖先。这也有效,但就像 1) 一样,这将再次带来我们想要避免的历史记录,因此 也不是解决方案

3) git commit -m 'squashed from [SHA=$feature_squashed_sha]' 字符串可以标记自动化系统 squash 提交实际上是某个提交的合并。这可能是一个解决方案....问题是正确获取提交消息是混乱并且容易出错

关于如何以一种既能使自动化解析稳健又足以让用户在他们的合并工作流程中实施的方式来实现这一点,有什么见解吗?

现在,我们不必使用git merge --squash,欢迎使用任何其他不可合并的方法,只要它使压缩点指向其原始 sha一致的方式。

此外,自动化系统可以配置为 运行 任何命令,只要它给出问题的答案 是否 feature HEAD 被压缩成 release?

怎么样...

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 存储在存储库本身内不断增长的文本文件中。

最后,您可以在每次压缩功能分支时简单地标记它...

您选择的工作流程似乎有点奇怪。假设你在 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的精神就是在融入release的时候杀掉feature。你想要做的更接近于变基。

如果您采用 git merge --squash 工作流程,请创建一个 lightweight tag 并让开发人员 运行 git tag -a squashed 在压缩合并之前。

(免责声明:我对 git 比较陌生。)