在 Git 中,我如何变基 + 压缩一个在其历史记录中有多个合并提交的分支,而无需挑选一个全新的分支



问题

我希望能够将一个最初从master分支的分支与master进行多次合并,使其在master上显示为单个提交。我们这样做是为了获取开发人员的分支,并在master中生成一个干净的历史记录(一旦它经过测试(。

我知道如何做到这一点,方法是在主指针(即"主指针"指针(的顶端创建一个新分支,并对其进行仔细挑选(根据需要解决冲突,但应该只能使用rebase命令(不是吗?(。这里的假设是,master本身没有被重新设置基数。

作为一个例子,我想以下面的历史记录为例,下面是分支主机和分支涂鸦:

原始历史

*  commit K, branch doodle, merge commit (conflicts)
/|
* |  commit J, branch master, 
| |
| *  commit I, branch doodle
* |  commit H, branch master
| |
| *  commit G, branch doodle,merge commit (conflicts)
|/|
| *  commit F, branch doodle
* |  commit E, branch master
| |
| *  commit D, branch doodle,merge commit (no conflicts)
|/|
* |  commit C, branch master
| *  commit B, Branch doodle 
|/
*    commit A, Branch master

并将其转化为master上的以下历史记录,其中doodle上的整个提交链被压缩并重新基于master的HEAD,如下所示。由于分支doodle的负责人已经提交了K,并且master和doodle之间的所有冲突都已经解决,因此执行以下操作应该像执行一个命令一样简单。此外,它并没有扰乱已经出版的大师的历史。

所需历史

*    commit L, branch master,(squash commit B,D,F,G,I,K)
|
*    commit J, branch master
|
*    commit H, branch master
|
*    commit E, branch master
|
*    commit C, branch master
|
*    commit A, branch master

另一种选择是生成下面显示的历史记录,而不是挤压在合并回master之前提交B'、F'、G'I'、J'、K'。这种方法然而,下面似乎增加了一个额外的步骤,rebase应该能够handle(解决冲突的albiet(。

备用历史

| *  commit K', branch doodle (possible conflict resolution)
| |
| *  commit I', branch doodle (possible conflict resolution)
| |
| *  commit G', branch doodle (possible conflict resolution)
| |
| *  commit F', branch doodle (possible conflict resolution)
| | 
| *  commit B', branch doodle (possible conflict resolution)
|/
*    commit K, branch master
|
*    commit H, branch master
| 
*    commit E, branch master
|
*    commit C, branch master
| 
*    commit A, Branch master

我尝试过的

目前,我正在从主提示创建一个新的分支,并在其上挑选B、F和I。这很有效,但比我认为的更复杂,因为我必须重新解决合并冲突。现在,我知道了rebase--rebase-merges标志。然而,由于某种原因,我不能得到--rebase-merges来产生";欲望历史";或者甚至替代历史。很可能我选择了带有rebase -i HEAD~N --rebase-merges的提交错误。

问题

一个人如何能轻易地从原始历史走向想要的历史?

此外,如果原始历史中的master在最后一次合并到doodle后有一些额外的提交,这种方法会允许在进入master之前解决冲突吗?

使用reset --soft很容易做到这一点

git checkout doodle
git reset --soft master
git commit -m "doodle, as a single commit"

没有麻烦。如果有更多提交到master,而这些提交不是doodle的部分,那么在执行此操作之前进行合并。

最新更新