当尝试将请求拉回主分支时,如何确保旧分支仍然可以重新定位?

how to ensure older branch can still be rebased when attempt to pull request back to main branch?

我的工作流程是这样的:

  1. 从主分支分支以创建版本分支,例如v1.1.1
  2. 从版本分支分支以创建功能分支,例如feature/001-add-x
  3. 当从功能分支返回到版本分支的拉取请求时,尝试进行变基和合并
  4. 从version分支到master分支做pull request时,尝试做rebase和merge

有时,当我尝试进行变基和合并时会发生冲突。

一个场景是这样的:

  1. 有一个关于 v1.1 到 master 分支的拉取请求正在等待批准。
  2. 因为我们想快速行动,所以我们从 master 分支分出一个 v1.2 ,然后 v1.1 重新建立基础并合并回 master。
  3. 我们从 v1.2 成功分支出另一个功能分支
  4. 完成功能分支后,我们拉取请求,然后重新建立并成功合并回v1.2
  5. 此时v1.1上的pull request被接受并rebase并合并回master。
  6. 现在我们在 v1.2 上发送一个合并请求到 master。
  7. 我们注意到 github 说虽然合并是可能的,但如果我们选择 rebase 和合并我们会发生冲突

我想到了一种可能的方法来避免这种情况,即总是在分支一个新版本分支之后主分支批准旧版本分支上的所有先前拉取请求。

但我想知道是否有一种方法可以在不等待所有旧版本分支成功合并回主分支的情况下允许变基和合并

建议?

无法直接合并github上新版本分支的rebase(如果新版本分支和旧版本分支都更改了相同的文件)。但解决方法是在本地对较新版本的分支进行 rebase,然后通过 PR 与 rebase 合并。我们可以通过下图来说明:

假设原始提交历史如下:

           G---H   V1.2
          /
...---A--B--C      master
             \
              D---E---F   V1.1

V1.1 分支与 rebase 合并到 master 分支后,提交历史将是:

           G---H   V1.2
          /
...---A--B--C---E'---F'      master
             \
              D---E---F   V1.1

如果 V1.1 分支和 v1.2 分支更改了相同的文件,github 拉取请求将阻止您使用 rebase 将 v1.2 合并到 master 分支,因为有冲突。

解决方法是在 PR 合并 v1.1master 完成后,将 v1.2 分支变基到 master 分支的顶部。您可以在本地分支中使用命令:

git checkout v1.2
git pull origin master --rebase
# resolve the conflicts in local repo
git pull origin v1.2 -f

那么提交历史将是:

                       G'---H'   V1.2
                      /
...---A--B--C---E'---F'      master
             \
              D---E---F   V1.1

现在可以通过rebase合并V1.2分支到master分支,github.

上的PR不会有冲突