将主分支的频繁合并历史合并为一个

Squash frequent merge history from main branch into one

例如,我刚刚将 master 分支合并到我的 feature 分支。然后有人在 master 上推送了新东西。所以我再次合并以跟上。然后有人又推了……我又合并了。如何压缩之前的合并,以便将两个合并操作合并为一个?

我怎样才能把这个:

o---o---A---B---C---D---E
         \       \   \   \
          F---G---H---I---J

进入这个:

o---o---A---B---C---D---E
         \               \
          F---G-----------J'

其中 J 和 J' 包含完全相同的代码。

如果您只在 G 之后对功能进行了合并提交,如您的图表所示,您可以将您的分支重置回该提交(使用 --hard 也可以重置您的工作副本文件),然后重做合并:

git checkout feature
git reset --hard G
git merge master

您也可以使用 git rebase master 而不是 git merge master,这样您的分支仅包含提交 F'G',从 E 分支到 master。

此方法通过将先前解决的更改重新播放到合并提交中来避免重新解决合并冲突的需要。

git checkout feature
git diff master > feature.patch
git reset --hard G
git branch --move trimmed_feature
git checkout -b feature master
git merge --strategy ours trimmed_feature --no-edit
git apply feature.patch --index
git commit --amend --message "Merge branch 'master' into feature"
git branch -D trimmed_feature

我们首先删除旧的合并以创建一个修剪过的功能分支,然后从 master 创建一个干净的功能分支,使用 git merge --strategy ours 合并到我们修剪过的功能分支以忽略更改,然后重新应用之前的-解决了补丁中的更改。