如何将压扁的提交从 master 传播到 develop 和 feature 分支

How to propagate squashed commit from master to develop and feature branches

我使用 git rebase 将 master 中的初始提交压缩为一个提交,生成一个新的压缩提交,但在开发分支上,提交保持原样。如何在 master to develop 和其他功能分支中用新的压缩提交替换旧提交?

当前状态

I--A--B                     :Master
       \ C--D               :Develop

压缩后

I--S                        :Master
 \ A--B--C--D               :Develop

我想要的

I--S                        :Master
   \ C--D                   :Develop
git rebase Master Develop

此命令将 ABCD 应用到 S。因为 AB 的变化已经包含在 S 中,所以被跳过。只有 CD 会被重新应用。 Develop 的历史将是:

I--S--C'--D'      :Develop

Master的历史不变:

I--S              :Master

rebase 过程中可能会遇到冲突。如果发生任何情况,

  1. 运行 git status查找冲突文件;
  2. 编辑文件,直到它们具有正确的内容;
  3. 运行 git add <files>;
  4. 运行 git rebase --continue.

我对 git rebase --onto A B C 的理解,在 bash:

commits=$(git rev-list --reverse B..C)
# if C is not a branch name, it leads to detached HEAD state.
git checkout C
git reset A --hard
for c in $commits;do
    git cherry-pick $c
done

ABCcommit-ish。这只是一个粗略的模拟。某些提交可能会被跳过,例如合并提交和更改已被其他提交预先包含的提交。