Git: 模拟PR合并并测试
Git: Simulate PR merge and test it
我们有一个 PR,它工作正常,但是 PR 有一个非常旧版本的 origin 分支,自从创建 PR 分支以来,origin 分支已经更新了很多。
那么我如何才能 "simulate" 在实际合并到原始分支之前进行合并和 运行 测试?
从 master 创建一个分支(或者你想测试的分支)
以这种方式合并您的拉取请求:
Merge pull request to a different branch than default, in Github
测试你的东西
如果你的测试成功,合并到 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 使用提交 B
和 C
作为 "what we did" 执行合并("merge" 作为动词),并提交 B
和 F
为 "what they did"。如果一切顺利 Git 会自动进行 new 提交,这会调整标签 mainline
以指向 到 新提交.如果事情进展不顺利,Git 迫使我们解决这个问题(在 work-tree 中编辑内容,并 git add
结果)并自己进行新的提交。这也会产生一个新的提交,它也会调整标签 mainline
以指向新的提交。在任何情况下,新提交都有 两个 parents:提交 C
和 F
(按此顺序)。换句话说,新提交是 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"—向右,在这些图表中。)
我们有一个 PR,它工作正常,但是 PR 有一个非常旧版本的 origin 分支,自从创建 PR 分支以来,origin 分支已经更新了很多。
那么我如何才能 "simulate" 在实际合并到原始分支之前进行合并和 运行 测试?
从 master 创建一个分支(或者你想测试的分支)
以这种方式合并您的拉取请求: Merge pull request to a different branch than default, in Github
测试你的东西
如果你的测试成功,合并到 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 使用提交 B
和 C
作为 "what we did" 执行合并("merge" 作为动词),并提交 B
和 F
为 "what they did"。如果一切顺利 Git 会自动进行 new 提交,这会调整标签 mainline
以指向 到 新提交.如果事情进展不顺利,Git 迫使我们解决这个问题(在 work-tree 中编辑内容,并 git add
结果)并自己进行新的提交。这也会产生一个新的提交,它也会调整标签 mainline
以指向新的提交。在任何情况下,新提交都有 两个 parents:提交 C
和 F
(按此顺序)。换句话说,新提交是 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"—向右,在这些图表中。)