Git 对从 master 合并的分支进行变基和压缩?

Git rebase and squash on branch that has merges from master?

我有一个功能分支,我已经与 master 并行工作了一段时间。在此期间,在直接对 master 进行一些更改后,我将这些更改合并到我的功能分支中。我还将一些小功能合并到功能分支中,因为小功能是大功能的一部分。

现在我想将我的功能分支合并到 master 上,但首先我想将功能分支上的一些提交压缩成更少的提交(或单个提交),因为我有很多类型的“工作progress", "--- WIP", 等等,我不想弄乱主人。

所以目前我有这样的东西

                        [dev/feature]
                             |              
                        Finally done!
                             |
                             | 
 [dev/smallfeature]          |                             [master]
          |                  |                                |
          |   Merge branch dev/smallfeature into dev/feature  |
          |                 /|                                |
          |----------------/ |                                |
          |                  |                                | 
          |      Merge branch master into dev/feature         |
          |                  |\                               |
          |                  | \------------------------------|
Made the small feature work  |                                |
          |                  |                         Fixed some typos
          |                  |                                | 
          |                  |                                |
          |             Work in progress...                   |
          |                  |                                |
          |      Merge branch master into dev/feature         |
          |                  |\                               |
          |                  | \------------------------------|
          |                  |                                |
   Experimenting...          |                      Released version 1.2.3
          |                  |                                |
          |             Working on it...                      |
          |                  |                                |
          |                  |                                |
          |                  |                                |
          |                   \-------------------------------|
          |                                                   |
          |                                                   |
          |                                            Fixed some colors 
          |                                                   |
          |                                                   |
           \--------------------------------------------------|
                                                              |

我想以这样的方式结束

      [master]
         |
         |
    Feature added
         |
         |
  Fixed some typos
         |
         |
Released version 1.2.3
         |
         |
  Fixed some colors
         |
         |

我正在使用 IntelliJ,当我从 Working on it...-提交以交互方式变基时,我也可以在对话框中看到直接在 master 上进行的提交。如果我 select 也“压扁”那些东西,我会把事情搞砸吗?它们已经在 master 上了,那么如果我压缩它们然后将我的功能分支合并到 master 上会发生什么?这可能吗?

为了达到您描述的结果,您只需执行 squash merge:

git switch master
git merge --squash dev/feature
git commit -m "Feature added"

Git 会将 dev/feature 中的文件与 master 中的文件合并,并在 master 之上构建一棵新树。由于您已经将 master 合并到 dev/feature,因此生成的树最终将仅包含 dev/feature.

中引入的更改