Git: 模拟PR合并并测试

Git: Simulate PR merge and test it

我们有一个 PR,它工作正常,但是 PR 有一个非常旧版本的 origin 分支,自从创建 PR 分支以来,origin 分支已经更新了很多。

那么我如何才能 "simulate" 在实际合并到原始分支之前进行合并和 运行 测试?

  1. 从 master 创建一个分支(或者你想测试的分支)

  2. 以这种方式合并您的拉取请求: Merge pull request to a different branch than default, in Github

  3. 测试你的东西

  4. 如果你的测试成功,合并到 master 并删除你的测试分支

您只需从您的开发分支执行以下操作即可复制您的分支指针:

git checkout -b test-branch

现在您处于 test-branch,这与您的开发分支相同。继续并合并(或者更好的是,变基)到当前的 master 分支:

git merge master

git rebase master

您可能需要在此过程中解决一些冲突。如果发生这种情况,Git 将打印关于如何操作的明确说明。现在 test-branch 被合并到 master 之上,从你的开发分支第一次分叉的地方开始。您的开发和主分支未受此操作影响。

如果您对合并感到满意,可以删除 test-branch 或使用 git branch:

将开发分支移动到合并点
git branch -f development test-branch

请记住,如果您原来的 master 分支已更改,您可能应该在 尝试合并或变基之前 更新它:

git fetch origin
git checkout master
git merge --ff-only origin/master

或者,如果您不介意可能从其他分支中引入更改,则可以只执行 git pull

是正确的(并且已投票),但图表可能会有所帮助。

理解这一点的关键是,对于 Git 中的大多数用途,分支 名称 几乎完全不相关。重要的是提交图(以及附加到该图中每个参与提交的快照)。

假设您有以下图表:

...--A--B--C         <-- mainline
         \
          D--E--F    <-- feature

并且您提议 git merge 功能分支到 main-line 分支。通常你会这样做:

git checkout mainline && git merge feature

这将指示 Git 使用提交 BC 作为 "what we did" 执行合并("merge" 作为动词),并提交 BF 为 "what they did"。如果一切顺利 Git 会自动进行 new 提交,这会调整标签 mainline 以指向 新提交.如果事情进展不顺利,Git 迫使我们解决这个问题(在 work-tree 中编辑内容,并 git add 结果)并自己进行新的提交。这也会产生一个新的提交,它也会调整标签 mainline 以指向新的提交。在任何情况下,新提交都有 两个 parents:提交 CF(按此顺序)。换句话说,新提交是 a 合并("merge" 作为名词)。所以让我们画这个:

...--A--B--C------G   <-- mainline
         \       /
          D--E--F     <-- feature

现在,请注意此图与 图相同:

          C
         / \
...--A--B   \-----G   <-- mainline
         \       /
          D--E--F     <-- feature

但是想象一下,我们可以让Git在提交后移动标签mainline,这样我们就可以得到这个图改为:

          C           <-- mainline
         / \
...--A--B   \-----G   <-- ??? (HEAD)
         \       /
          D--E--F     <-- feature

除了把分支名mainline单独留下,效果完全一样:我们做同样的merge-as-a-verb工作,做同样的merge-as-a-noun 提交 object G.

如果你创建一个新的分支名称(填写 ??? 部分),就会发生这种情况。 "before the new merge"图片为:

          C           <-- mainline, test-branch (HEAD)
         /
...--A--B
         \
          D--E--F     <-- feature

并且 after-merge 图片是添加了合并提交 G 的图片。

Git 根据 HEAD.

知道 要更新哪个 分支名称

请注意,您甚至可以使用 Git 的 "detached HEAD" 模式进行合并。在这种模式下,名称 HEAD 直接 指向 提交 ID,而不是让 HEAD 文件存储分支名称。 Git 的其余部分照常工作,但是在进行新提交时,不是更新存储在 HEAD 中的 branch-name——没有一个——Git 只是更新 HEAD本身。

一旦你确定合并是好的,你就可以在fast-forward操作中请求Git到"slide the name mainline forward":

          C           <-- (old mainline)
         / \
...--A--B   \-----G   <-- HEAD, (new mainline if slide-forward works)
         \       /
          D--E--F     <-- feature

此 "slide forward" 操作 失败 ,是故意的,如果无法向前滑动。例如,假设我们的工作是进行合并、解决冲突或我们必须做的任何事情,然后 运行 我们的测试花费了相对较长的时间......而在那段时间里, 其他人 偷偷进来并更新了 mainline,添加了他们自己的一些新提交:

          C---------H   <-- mainline
         / \
...--A--B   \-----G     <-- HEAD
         \       /
          D--E--F       <-- feature

不再可能 "slide forward" 到 G:名字 mainline 必须先 "slide back" 到 C,丢失 H. fast-forward操作会失败,让我们知道我们的临时合并G终究无法成为分支mainline的永久成员。

(我把新的commit H画成一个普通的commit,但是不管是simple commit还是merge commit:关键是它在[=20之后=],但不在 G 之后。这些 fast-forward 操作 必须 移动 "forward"—向右,在这些图表中。)