问题
我希望能够将一个最初从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的部分,那么在执行此操作之前进行合并。