从PR中已经存在的PR中排除提交

时间:2018-10-11 18:13:45

标签: git github

我有一个公开的PR,我已经提交了

我进行了另一次提交,并希望通过这些更改来创建另一个PR。.但是先前的提交在那里。

我知道分支机构可以解决这个问题,但是,到此为止。我是否只需要等待PR合并?

3 个答案:

答案 0 :(得分:1)

  

我有提交的公开PR

那时,您的存储库看起来像这样。

A - B [master]
     \
      C [pr1]

提交B是master所在的位置。并且您有一个名为pr1的分支,上面有一个提交C。

  

我进行了另一次提交,并想通过这些更改来创建另一个PR。.但是以前的提交在那里。

可能发生的事情是您从pr1分支而不是master分支。

A - B [master]
     \
      C [pr1]
       \
        D [pr2]

默认情况下,当您为pr2创建PR时,基本分支为master,因此它在PR中显示CD


如果 D中的工作不依赖于C ,您想要的是pr2并提交{{1 }}从D分支。

master

您可以通过将 D [pr2] / A - B [master] \ C [pr1] 重新部署到pr2上来解决此问题。

master

这表示将从(但不包括)git rebase --onto master pr1 pr2 到(并包括)pr1的提交重播到pr2上。然后,您可以按master并创建独立的PR。


如果 pr2中的工作确实取决于D ,那么最好将C放在{{1 }}。为pr2创建一个PR,基址为pr1,而不是pr2pr1被审核并接受后,master就可以被审核并接受。

请确保在PR说明中记下pr1堆积在pr2的顶部,这样审阅者就不会错过它。 “这取决于#123”,其中#123是pr2的PR的ID。

答案 1 :(得分:0)

只需从要开始的任何位置创建一个新分支,然后挑选其他分支即可。这将应用在另一个分支的最新修订中涉及的更改,而不会进行其他更改(假定它是该分支的最新修订)。

答案 2 :(得分:0)

一种简单的方法是使用interactive rebase

如果在分支机构上运行git log --oneline,您应该会看到类似以下内容的内容:


ccccccc (HEAD -> your-branch-name) Your (good) commit you want to keep
bbbbbbb bbbbbbb Your (bad) commit you want to remove from history
aaaaaaa (master) Commit from you or someone else

current

您说要删除bbbbbbb并替换为ccccccc

由于cccccccbbbbbbb起包含更改,因此将其删除会引起很多冲突,因为您必须将ccccccc合并到aaaaaaa中。

git的实现方式是将squash ccccccc放入bbbbbbb,创建新的提交ddddddd。为此,您需要执行以下步骤:

1 。运行git rebase -i aaaaaaa,从您要删除的提交之前的立即提交开始,打开交互式rebase

这将打开您配置的文本编辑器,如下所示:


pick bbbbbbb Your (bad) commit you want to remove from history
pick ccccccc Your (good) commit you want to keep

# Rebase aaaaaaa..f5a9551 onto aaaaaaa (2 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# .       create a merge commit using the original merge commit's
# .       message (or the oneline, if no original merge commit was
# .       specified). Use -c <commit> to reword the commit message.
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
#   However, if you remove everything, the rebase will be aborted.
#
#   
# Note that empty commits are commented out

该列表显示了交互式资源库将执行的操作: 从aaaaaaa中选择bbbbbbb,然后选择ccccccc

2 。就像我在上面说的,您想将squash ccccccc改成bbbbbbb,所以用pickccccccc之前的单词squash替换为pick bbbbbbb Your (bad) commit you want to remove from history squash ccccccc Your (good) commit you want to keep


ccccccc

3 。保存文件,然后关闭文本编辑器。

4 。将打开另一个文本编辑器,要求您使用bbbbbbbddddddd的组合来指定正在创建新提交的消息,为方便起见,我将其称为# This is a combination of 2 commits. # This is the 1st commit message: Your (bad) commit you want to remove from history # This is the commit message #2: Your (good) commit you want to keep 这个例子:


ddddddd (HEAD -> your-branch-name) Your (good) commit you want to keep
aaaaaaa (master) Commit from you or someone else

在这里,您可能要删除除最后一行以外的所有内容,该行包含最新提交的消息,但是可以随意自定义消息。

5 。保存文件,然后关闭文本编辑器。

重新设置已经完成,您的历史记录应如下所示:


origin

before pushing

6 。现在,您要做的就是发送以将分支推送回您的push --force(例如GitHub / BitBucket / GitLab)等,以更新您的请求请求。

为此,您必须执行 git push origin your-branch-name --force ,以便将您的远程分支替换为新分支。


:checked

final result

当然,您始终可以选择关闭前一个拉取请求,然后打开一个新的(具有不同的分支名称)请求。