git 中的 Squash 合并保持包括以前合并的分支
Squash merging in git keeps including previously-merged branches
我正在使用 Github,其中包含 development
、live
的分支以及各种功能和错误分支。
当我将功能或错误修复合并到开发中时,我通常会进行压缩合并(通常通过 GH 网站,尽管它等同于 git merge --squash branchname
)。
然后当我从开发中更新 live 时,我将 merge dev 压缩到 live 中。
这样做的好处是提交消息会自动填充提交列表(因为这些也被压缩,所以是 PR 列表)。
我遇到的问题是,即使在将 dev 合并到 live 之后,live 分支仍然被列为落后于 development - 所以下次我合并这两个时,它包括我知道已经合并的提交。
我认为我所做的相当于:
git checkout feature/1
& 进行更改
git checkout development
git merge --squash feature/1
git commit
git checkout live
git merge --squash development
(添加一个提交到 live)
git commit
git checkout feature/2
并进行更改
git checkout development
git merge --squash feature/2
git commit
git checkout live
git merge --squash development
(添加 两个 提交 - feature/1
和 feature/2
)
为什么不在第 6 步后 'completing' 合并并在其下画一条线?
“挤压合并”并不是真正的合并。它本质上说“从这些更改创建一个补丁,并将该补丁应用到目标分支”。重要的是,它不记录与原始提交的任何关系。
因此,就 git 而言,您的存储库包含三个 完全不相关的 提交:
feature/1
上的原始提交(如果删除该分支,可能会被垃圾收集)
- 在
development
上使用您的第一个“挤压合并”创建的提交
- 在
live
上创建的提交与您的下一个“挤压合并”
作为一般规则,在“压缩合并”分支的更改后,您不应继续使用该分支 - 它的历史记录现在代表一个“替代现实”,它永远不会匹配目标分支.这对于原始功能分支可能没问题 - 一旦合并就可以将其删除。对于 development
,您必须删除它,然后从 live
重新创建它;或者,等效地,将其硬重置为指向与 live
.
相同的提交
straight-forward 解决方案只是不使用从 development
到 live
的压缩合并。要么使用真正的合并(创建合并提交,记录合并提交之间的关系),要么使用fast-forward合并(re-point live
在 development
中的现有提交中,根本不创建任何新提交)。
我正在使用 Github,其中包含 development
、live
的分支以及各种功能和错误分支。
当我将功能或错误修复合并到开发中时,我通常会进行压缩合并(通常通过 GH 网站,尽管它等同于 git merge --squash branchname
)。
然后当我从开发中更新 live 时,我将 merge dev 压缩到 live 中。
这样做的好处是提交消息会自动填充提交列表(因为这些也被压缩,所以是 PR 列表)。
我遇到的问题是,即使在将 dev 合并到 live 之后,live 分支仍然被列为落后于 development - 所以下次我合并这两个时,它包括我知道已经合并的提交。
我认为我所做的相当于:
git checkout feature/1
& 进行更改git checkout development
git merge --squash feature/1
git commit
git checkout live
git merge --squash development
(添加一个提交到 live)git commit
git checkout feature/2
并进行更改git checkout development
git merge --squash feature/2
git commit
git checkout live
git merge --squash development
(添加 两个 提交 -feature/1
和feature/2
)
为什么不在第 6 步后 'completing' 合并并在其下画一条线?
“挤压合并”并不是真正的合并。它本质上说“从这些更改创建一个补丁,并将该补丁应用到目标分支”。重要的是,它不记录与原始提交的任何关系。
因此,就 git 而言,您的存储库包含三个 完全不相关的 提交:
feature/1
上的原始提交(如果删除该分支,可能会被垃圾收集)- 在
development
上使用您的第一个“挤压合并”创建的提交 - 在
live
上创建的提交与您的下一个“挤压合并”
作为一般规则,在“压缩合并”分支的更改后,您不应继续使用该分支 - 它的历史记录现在代表一个“替代现实”,它永远不会匹配目标分支.这对于原始功能分支可能没问题 - 一旦合并就可以将其删除。对于 development
,您必须删除它,然后从 live
重新创建它;或者,等效地,将其硬重置为指向与 live
.
straight-forward 解决方案只是不使用从 development
到 live
的压缩合并。要么使用真正的合并(创建合并提交,记录合并提交之间的关系),要么使用fast-forward合并(re-point live
在 development
中的现有提交中,根本不创建任何新提交)。