这是我当前的结构(一个git log
,但没有文本(,功能分支从master
:分支
D <- Keep this
C <- Squash/meld everything before into this
*
ME <- Merge commit
|
| B
* |
* |
|/
A <- First commit of the feature branch
MA <- master
我想保留当前特性分支D
的最后一次提交,并将之前的所有内容压缩/融合到第二次最后一次的提交C
中,如下所示:
D
C' <- Squash everything before C and C itself
MA
然后,我用git rebase -i master
:重新建立基础
保留了第一个提交
A
,所以我使用pick
。这将成为C'
。在
A
和C
之间的一切都是squash
。我没有看到合并提交
ME
,但列出了所有其他提交。根据这个SO,merge-commit将在其分支中包含所有内容,但消息为B
。列出了B
,所以这似乎很好。保留最后一次提交的
D
,因此再次保留pick
。
在重新定基时,我看到了很多冲突。在检查之后,所有的冲突都通过接受";输入变化";,因为它包含更新的代码。
然而,在重新建立基础之后,代码不再编译,现在一团糟。我意识到合并提交ME
中的代码丢失了。ME
不是一个微不足道的合并,在合并之前我必须解决很多冲突。
然后,我尝试做一个重新基准,在这个基准中,我将pick
所有的提交。我认为它应该在没有任何冲突的情况下进行,并保持历史完整(或重现完全相同的历史(。但是git抱怨存在冲突,并且冲突与上面的交互式rebase会话中的冲突完全相同。
我应该怎么做我的基础?
这里有一种方法:
-
运行
git rebase -i HEAD~2
-
定序器脚本应该提到
C
和D
:将
C
操作设置为edit
,保存并关闭 -
重新基准将应用
C
并暂停。此时,运行
git reset --soft MA
,然后运行git commit
(这将在一次提交中压缩MA..C
( -
现在继续重新设置基准:
git rebase --continue