那将是一个git rebase --onto
加上git merge-base
:
git checkout stage/2.0
git rebase --onto stage/onto $(git merge-base development feature) feature
这会将feature
分支的 G
提交(这是开发和功能之间的“合并基础”提交)重播到stage/2.0 branch
.
结果:
stage/2.0.0 A--B--C--D
\
feature H'--I'--K'
development E--F--G--J--L
旧的H
,I
和K
提交仍然在 reflog ( git reflog
) 中被引用,但已经被精心挑选并在stage/2.0
.
这个工作流程正确吗?我们是否正在尝试做一些不可持续的事情?
确实是这样,但需要注意的是:
在这样的变基之后,它需要进行仔细的测试,因为H
,I
以及K
在 之上完成的地方,分支G
中根本不存在。stage/2.0
如果这些提交依赖于基于的G
内容,那么在暂存分支中将找不到该初始内容。一些回归测试应该使这一点变得明显。
使用git cherry-pick
(也可以重放多个提交)会将这些提交复制到暂存分支上,使feature
分支保持原样(即不重新基于暂存分支)。
这似乎很奇怪,考虑到您需要开始挑选哪些提交,以及哪些其他新feature
提交尚未挑选到暂存。
如果将开发合并到 和 之间的功能中会发生I
什么K
?(开发人员缓存他们的分支)
cherry-pick 是否还会包含该合并以及所有开发分支代码?
是的,它将包括合并提交,但不包括所有dev
分支。无论如何,它并不理想。最佳实践不是合并dev
到feature
,而是在( )feature
之上重新定位。
然后,当功能准备就绪时,dev
git rebase dev
rebase --onto stage/2.0
那么该rebase --onto
命令的作用基本上是将功能分支移动到stage/2.0.0
?
是的。
功能分支会消失吗?
否:它是通过将每个提交补丁重新应用到 stage/2.0.0
.
之前看到的功能分支的旧提交rebase --onto
仍然存在,但不可见,仅由 引用git reflog
,如上所述。
嵌套命令$(git merge-base development feature)
是在将分支移动到 stage/2.0.0 分支之前应用从特性到开发的更改吗?
否:它是计算该功能分支的起始提交,即:development
从哪个feature
分支开始的提交。
如果我没有使用它,而是一个简单git rebase
的,来自feature
分支的提交将包括从HEAD访问的所有提交(这也将包括提交)feature
development