Git 工作流程:如何合并仅在新分支上进行的提交

Git workflow: How to merge commits made only on new branch

我们正在使用 git 来跟踪开发和版本化发布,并且 运行 用于合并 b运行ches 的一些问题。这是我们的工作流程:

production/1.0.0  A--B

stage/2.0.0       A--B--C--D

development       E--F--G--J--L
                         \
feature                   H--I--K

功能开发发生在功能 b运行ch 上,该功能是从开发中创建的,准备好后合并回以进行演示和测试。

一切正常,问题是当创建该功能 b运行ch 的开发人员将他们的功能放入阶段 b运行ch 进行部署时。因为他们运行在 G 停止了开发,当他们去合并时,当他们只想合并 HIK 时,它包括 EFG。

我们 git 工作流的目标是让开发人员标记他们自己的代码以准备发布并协调整个开发 b运行ch 将能够合并到部署 b运行ch 是不可行的,因为世界各地都在发展。

是否有 git 命令来合并对功能 b运行ch 所做的提交?我知道 rebase 和 cherry pick,但是一个特性可以由大量提交组成,开发合并可以赶上他们的特性 b运行ch。有更好的解决方案吗?

这个工作流程正确吗?我们是否正在尝试做一些不可持续的事情?

那将是 git rebase --onto coupled with git merge-base:

git checkout stage/2.0
git rebase --onto stage/onto $(git merge-base development feature) feature

这将重播 feature 分支 G 之后的提交(这是开发和功能之间的 "merge base" 提交) stage/2.0 branch.

结果:

stage/2.0.0       A--B--C--D
                            \                   
feature                      H'--I'--K'

development       E--F--G--J--L

旧的 HIK 提交在 reflog (git reflog) 中仍然被引用,但已经被挑选出来并在stage/2.0.

Is this workflow correct? Are we trying to do something that is not sustainable?

是的,但有以下警告:
它需要在这样的变基之后进行仔细的测试,因为 HIK 是在 G 之上完成的,而 G 中根本不存在21=]分支.

如果这些提交依赖于基于 G 的内容,那么在登台分支中将找不到该初始内容。一些回归测试应该使这一点显而易见。

使用git cherry-pick (which also can replay multiple commits) 将复制 那些提交到暂存分支上,而 feature 分支保持原样(即不重新基于暂存分支) .
这似乎很奇怪,考虑到您将需要开始挑选哪些提交是精心挑选的,以及哪些其他新的 feature 提交尚未经过精心挑选以进行暂存。


What would happen if development was merged into feature between I and K? (The developer caching up their branch)
Would the cherry-pick also include that merge and all the development branch code along with it?

是的,它将包括合并提交,但不包括所有 dev 分支。无论如何,这都不理想。最佳做法不是将 dev 合并到 feature,而是在 dev (git rebase dev).
之上重新设置 feature 的基址 然后,当功能准备就绪时,rebase --onto stage/2.0


So what the rebase --onto command does is basically move the feature branch onto stage/2.0.0?

是的。

Does the feature branch go away?

否:通过重新应用每个提交补丁 stage/2.0.0.
来重新创建 在 rebase --onto 之前看到的功能分支的旧提交仍然存在,但不可见,仅被 git reflog 引用,如上所述。

The nested command $(git merge-base development feature) Is that applying the changes from feature to development before moving the branch to the stage/2.0.0 branch?

否:计算该功能分支的起始提交,即:feature 分支开始的 development 提交。
如果我不使用它,而是使用一个简单的 git rebase,来自 feature 分支的提交将包括 all 可从 feature HEAD 访问的提交(并且将包括 development 提交)