据我了解,您希望将 old-1 保留为单独的提交,但将 old-2 中的所有内容压缩回某个起点,并放入单个提交中。而且你不想用交互式 rebase 来做这件事。
我确信有一些聪明的方法可以做到这一点,但这里有一个简单的方法。我将从这种情况开始:
* 699abbb (HEAD -> actual) e
* 6c924b6 d
* 51c7c64 c
* 2f15c0c b
* ae36341 a
| * c785b2c (main) second
|/
* e77cdf8 start
我的目标是保留e,但将a、b、c 和d 转换为单个提交,我将其称为squash。开始了。请注意,我实际上是在 actual 开始的:
git switch -c temp HEAD~1
git reset --soft e77cdf8
git commit -msquash
我们现在有了这个:
* 56d04c1 (HEAD -> temp) squash
| * 699abbb (actual) e
| * 6c924b6 d
| * 51c7c64 c
| * 2f15c0c b
| * ae36341 a
|/
| * c785b2c (main) second
|/
* e77cdf8 start
这可能看起来没有任何改进,但实际上squash 与a 和b 和c 和d 挤在一起是一样的。所以我们需要做的就是把它们扔掉,把e贴在temp的末尾,紧跟在squash之后。那好吧:
git switch actual
git rebase --onto temp actual~1 actual
git branch -d temp
现在我们有了这个:
* f259d42 (HEAD -> actual) e
* 56d04c1 squash
| * c785b2c (main) second
|/
* e77cdf8 start
正如我所说,squash 是旧 a 和 b 和 c 和 d 的总和,这正是您要寻找的。现在,如果您想使用 actual 做更多事情,您可以这样做,但分支历史看起来就像您想要的那样。