什么是:
有分支C ,其中嵌入了分支A和B。
* 113cfa6 (HEAD -> master) 12
* 74f6351 10
| * f63d30b (C) Merge branch 'B' into C
| |\
| | * afe44c6 (B) 8
| | * 1da5826 7
| * | 3b5fa89 11
| * | 93d7b1d Merge branch 'A' into C
| |\ \
|/ / /
| * | 9023742 (A) 3
| * | 8e7ac5c 2
* | | eb15793 (X) 9
| |/
|/|
* | 01ea56d 6
* | 11585f1 5
* | c8905ca 4
|/
* dc6c154 1
你需要什么:
您需要将分支C倒回到master的最后一次提交。
* 6099fa1 (C) Merge branch 'B' into C
|\
| * afe44c6 (B) 8
| * 1da5826 7
* | b8a7ffd 11
* | 7f48be6 Merge branch 'A' into C
|\ \
| * | 9023742 (A) 3
| * | 8e7ac5c 2
* | | 113cfa6 (HEAD -> master) 12
* | | 74f6351 10
* | | eb15793 (X) 9
| |/
|/|
* | 01ea56d 6
* | 11585f1 5
* | c8905ca 4
|/
* dc6c154 1
我尝试了什么:
git rebase master C但这会杀死所有合并提交并将分支A和B的所有提交重新设置为master。
故事:
让我解释一下这些奇怪的要求是从哪里来的。master用于从远程获取最新数据,所有交付都通过 pullrequest 进行。每个单独的分支(A,B)都是针对特定问题的解决方案。在某个时期结束时,pr创建一个分支(C),其中合并了几个分支(A,B),创建一个 pullrequest 并运行测试。测试,一如既往,失败和修复,如果可能的话,被交付给合并在pr(C)中的那些分支(A,B)。但有时会有冲突或修复无法添加到分支(A,B),因此在分支pr(C)中有单独的提交(11)。当修复通过时,分支master已经在向前运行,您需要将更改合并到分支pr(C) 中。来自 master 的合并经常发生在分支中pr(C) 一半的提交是 master's gravy,然后 pullrequest 被接受并且 master 变成了一个“master's gravy”的网络。有一个想法可以避免与 master 进行不必要的合并,因此决定pr从上次提交中倒回分支 (C),master而不是与其合并。
您需要选项
-p(--preserve-merges),它强制rebase不部署合并,而是保存它们。注意:不建议将此选项与-i(--interactive) 一起使用,如果这样做,请不要重新排序提交,否则结果可能会出乎意料。