git 中的 Squash 合并保持包括以前合并的分支

Squash merging in git keeps including previously-merged branches

我正在使用 Github,其中包含 developmentlive 的分支以及各种功能和错误分支。

当我将功能或错误修复合并到开发中时,我通常会进行压缩合并(通常通过 GH 网站,尽管它等同于 git merge --squash branchname)。

然后当我从开发中更新 live 时,我将 merge dev 压缩到 live 中。

这样做的好处是提交消息会自动填充提交列表(因为这些也被压缩,所以是 PR 列表)。

我遇到的问题是,即使在将 dev 合并到 live 之后,live 分支仍然被列为落后于 development - 所以下次我合并这两个时,它包括我知道已经合并的提交。

我认为我所做的相当于:

  1. git checkout feature/1 & 进行更改
  2. git checkout development
  3. git merge --squash feature/1
  4. git commit
  5. git checkout live
  6. git merge --squash development(添加一个提交到 live)
  7. git commit
  8. git checkout feature/2 并进行更改
  9. git checkout development
  10. git merge --squash feature/2
  11. git commit
  12. git checkout live
  13. git merge --squash development(添加 两个 提交 - feature/1feature/2

为什么不在第 6 步后 'completing' 合并并在其下画一条线?

“挤压合并”并不是真正的合并。它本质上说“从这些更改创建一个补丁,并将该补丁应用到目标分支”。重要的是,它不记录与原始提交的任何关系

因此,就 git 而言,您的存储库包含三个 完全不相关的 提交:

  • feature/1 上的原始提交(如果删除该分支,可能会被垃圾收集)
  • development 上使用您的第一个“挤压合并”创建的提交
  • live 上创建的提交与您的下一个“挤压合并”

作为一般规则,在“压缩合并”分支的更改后,您不应继续使用该分支 - 它的历史记录现在代表一个“替代现实”,它永远不会匹配目标分支.这对于原始功能分支可能没问题 - 一旦合并就可以将其删除。对于 development,您必须删除它,然后从 live 重新创建它;或者,等效地,将其硬重置为指向与 live.

相同的提交

straight-forward 解决方案只是不使用从 developmentlive 的压缩合并。要么使用真正的合并(创建合并提交,记录合并提交之间的关系),要么使用fast-forward合并(re-point livedevelopment 中的现有提交中,根本不创建任何新提交)。