开发人员本应从 master 创建一个功能分支,然后开始编码,但他们却从开发分支创建了一个功能分支,然后 merge 到开发分支。 (并非开发分支的所有功能都将在主分支上)
当我尝试创建一个 PR 将他的功能分支(而不是开发) merge 到发布分支(发布分支是从主分支创建的)时 - 它显示了他未提交的 PR 上的提交,并且提交正在显示来自 master 分支上不存在的开发分支。为什么会发生这种事?
开发人员仅将 Task-6 Suspend Post
提交到 Task-6-Suspend-Post
分支。
示例:
https://github.com/superc0der/test/compare/RELEASE/1.5.0...Task-6-Suspend-Post?expand=1
只有 Task-6 Suspend Post
应该 merge 到发布分支上。 (https://github.com/superc0der/test/commit/62f68ec3d951bca5b848932df01ea8a29f0f562f)
我需要进行选择还是有其他解决方案来解决这个问题?一些功能分支也有同样的问题。
最佳答案
问题
merge 操作将两个(或更多)分支连接在一起形成一个提交( merge 提交)。您有以下情况:
A - B (master)
\
C - D (develop)
\
E (Task-6-Suspend-Post)
由于 Task-6-Suspend-Post
分支是从 develop
创建的,因此它包含提交 C
和 D
在它的历史中。将 Task-6-Suspend-Post
merge 到 master
时,以下历史记录将如下所示:
A - B --------- G
\ /
C - D /
\ /
E
换句话说,PR 是为 master 上最新的内容创建 merge 提交的请求
(B
) 和 Task-6-Suspend-Post
(E
) 的最新信息。这将使提交 C
和 D
在 master 的历史记录中可用,从而包含在 pull 请求中。
解决方案
制作rebase Task-6-Suspend-Post
将解决您的问题。
git rebase master Task-6-Suspend-Post
上述命令将创建一个新的提交 E'
,其内容与 E
相同,但 master 头 (B
) 为 parent 。分支指针 Task-6-Suspend-Post
将附加到新的 E'
提交。
E' (Task-6-Suspend-Post)
/
A - B (master)
\
C - D (develop)
通过强制推送新的 Task-6-Suspend-Post
并发出新的 pull 请求,PR 中只应包含一次提交。
git push origin -f
关于git - 我必须做 cherry-pick 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53032667/