git - 我必须做 cherry-pick 吗?

标签 git github

开发人员本应从 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 创建的,因此它包含提交 CD在它的历史中。将 Task-6-Suspend-Post merge 到 master 时,以下历史记录将如下所示:

A - B --------- G
     \         / 
      C - D   /
           \ /
            E 

换句话说,PR 是为 master 上最新的内容创建 merge 提交的请求 (B) 和 Task-6-Suspend-Post (E) 的最新信息。这将使提交 CD 在 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/

相关文章:

node.js - heroku git 存储库的 URL 是什么?

git - Buildkite 和 webhook 到 git repo

git - 更新我在 github 上的存储库

android - 尽管删除 git 子模块仍出现 "detached HEAD"错误

Git 智能 HTTP 协议(protocol)无法在推送时执行服务器端 Hook

git - 如何让 git 显示对单个重命名文件的更改

git - 我如何 git checkout 多个 pr

swift - 使用Github时如何隐藏APPKey

git - 无法从 Gitlab : Permission denied, 克隆存储库,请重试

git - 如何设置 Git 以通过代理