如何使用Github回滚按钮撤销PR后再次进行PR和合并

93
基本上,我使用Github revert button来撤销以前的一个功能分支PR,将其合并到master中,然后我决定再次合并相同的功能分支,但我无法这样做。步骤如下:
  1. 合并功能分支master的PR
  2. 从(master)撤销PR合并
  3. 尝试创建新的PR再次将功能分支合并到master中。
  4. 得到这个消息:

没有任何东西可以比较。

master已经更新了所有来自功能分支的提交。尝试切换你的比较基准。

有什么建议可以让我再次将功能分支合并到master吗?

7个回答

81

只需撤销还原即可。点击还原按钮后,您将创建一个新的PR (第二步)。一旦这个PR被合并,您将有选项将其撤销,这将创建一个新分支,并将所有更改恢复到该分支中。然后,您可以拉取此分支,并根据需要进行更改,并创建一个新的PR。您将失去Github上所有提交消息,但所有文件更改仍将存在。在新的PR中参考您的原始分支和还原即可。

任何事情都要避免复杂的变基或强制推送到主分支。


A) rebase是一个有用的工具,不要因为它复杂而避免使用。 B) 恢复撤销操作有注意事项(请参见我的回复)。 - theannouncer
如果你想清理掉丑陋的分支名称 revert-123-revert-123.. 或类似的,你可以使用 git branch -m <new_name> 重命名分支,然后推送提交 - git push origin -u <new_name>,最后删除那个丑陋的分支名称 git push origin --delete revert-123-revert-123。更多信息请参考 https://linuxize.com/post/how-to-rename-local-and-remote-git-branch/。 - Aleks
如果原始PR包含A+B,现在你只想合并A,则不起作用。 - bshirley
由于Github的还原按钮并不总是有效,替代方法是手动还原Github先前创建的还原提交。然后将其推送到新分支并创建PR。当然,在开始之前,请确保您的主分支是最新的。(请注意,github会创建一个包含被还原的原始分支中所有提交的单个还原提交。因此,手动还原它很容易) - Stan

69
我写这篇答案是因为我遇到了这个问题,而且我发现这里的回答更多是理论性的,不太实用。我搜索了一些资料,并找到了解决这个问题的方法。你可以在这篇文章here中找到更详细的答案。
要解决这个问题,你需要创建一个新分支,跟踪主分支并撤销撤销提交。然后切换到功能分支并合并新分支。现在你可以解决冲突(如果有的话),提交并创建一个新的PR。
以下是命令:
# do the needed changes in the feature branch
$ git commit -m "fixed issues in feature-branch'

# create new branch tracking master branch
$ git checkout -b revert-the-revert-branch -t master

# revert the reversion commit
# find it from your git log
# in linux try: 'git log | grep revert -A 5 -B 5'
$ git revert <revert-commit-hash>

# checkout the original feature branch
$ git checkout feature-branch

# merge the revert branch
$ git merge revert-the-revert-branch

# handle merge conflicts and commit and PR

3
@Aboodred1请将此标记为答案,因为大多数人认为这是有用和实用的答案。 - Shanika Ediriweera
嗨,Shanika,你的策略意味着我们仍然应该掌握特性分支。但是,如果在合并时删除了特性分支(现在几乎所有版本控制平台都会这样做),该怎么办? - Daniel Faria Sampaio
如果提交和还原包含A+B,而您想应用A,则无法正常工作。 - bshirley

8

我知道这个问题有点老,但是如果有人需要一个好的答案,这里有:

当您合并了PR并删除分支后,稍后撤消此合并,您可以创建一个新分支,然后撤消撤消。将其推送到远程仓库并创建一个新的PR。

这将创建一个名为“revert“revert #123 blabla”的提交的新PR,其中包含所有差异上的更改。

https://www.tildedave.com/2012/11/24/reverting-a-github-pull-request.html


5
  1. 切换到主分支并打印提交日志git log --oneline。在此搜索用于PR的提交并复制提交哈希码。
  2. 现在运行git cherry-pick YOUR_HASH_CODE。这将把该特定提交提取到头部。
  3. 现在创建一个新分支并切换到这个新创建的分支,并将其推送到git。
  4. 现在从这个新创建的分支创建一个PR请求到主分支。

4

什么

你应该拉取最新的主分支,将你的分支在主分支上进行变基,然后你就能够发起另一个拉取请求。


为什么

之所以无法自动合并回去是因为分支的基础与主分支的HEAD不同步。

撤销还原可能会变得混乱,有时也缺乏透明度。

此外,撤销还原会防止其他具有此代码的分支正确地合并。

假设您在主分支上有功能x,并将其合并到分支y中。然后您决定主分支不应该已经合并了功能x,因为它依赖于分支y。所以,您在主分支上进行还原操作。当您尝试合并分支x时,git-merge命令会看到原始合并,并欣喜地宣布一切正常,分支已经被合并,省略了这些针对功能x的提交,即使您希望它们与分支y合并。


这个回答只在基本情况下才足够,因为你必须去找到旧分支并将所有内容复制到文本编辑器中创建一个新分支。安东尼的解决方案更加透明,唯一的混乱在于自动生成的 Github 名称,你可以自己修改。 - xHocquet
3
为什么需要将任何内容复制到文本编辑器中?只需拉取主分支,切换到你的分支(该分支的名称在PR中,因此您不必“查找”任何内容),拉取分支,使用git rebase master 命令,强制推送分支即可。完成。 - theannouncer
无法正常工作:git checkout master; git pull; git checkout feature; git pull; git checkout -b feature_rebase; git rebase master; git push(长版本);尝试在远程 git 存储库上创建 PR - 零文件。 - bshirley
如果尝试使用交互式方式运行rebase,以便了解rebase中的提交情况。 - theannouncer
@bshirley 我认为这种方法依赖于从被还原的分支重写提交。因此,您需要在主分支上有一个新的提交,这样当您将被还原的分支在其之上进行变基时,它的提交将被重写。(不是100%确定,没有尝试过) - Stan

2
  1. 进入撤销 PR 页面,点击“撤销”(但不要合并)
  2. 执行 git fetch
  3. 执行 git checkout <撤销的撤销分支名称>

您所有的更改都将在那里,并且当您创建 PR 时,更改将显示。

需要明确的是 - 在撤销 PR 上点击“撤销”会给您一个名称,例如 revert-202-revert-201-originalbranchname。这就是您想要编辑的分支!


2

这是我所做的事情。

  1. 检出您的特性分支

  2. 将其与基础分支合并: 这将使您的特性分支处于基础分支的状态,因为您的特性分支提交已经成为基础分支的一部分。您的特性分支提交将位于撤销PR提交下方。

  3. 然后撤销撤销您的PR的提交。这将使您的特性分支恢复到其原始状态,但现在有一个新的提交。

  4. 推送到特性分支,然后提出PR。

为什么这样做有效? 通过合并,您可以将您的特性分支与基础分支同步,即使它具有与基础相等的提交-需要超越基础并获取撤消更改的提交以将其添加到您的特性分支中。

通过撤销,您可以撤消删除您更改的更改,并且现在您的更改可以成为在基础分支之前的新提交的一部分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接