使用错误的父分支修复已发布的分支

时间:2011-01-12 20:55:22

标签: git github

我遇到了一个问题,我向我的公共git存储库发布了一个错误的父分支的分支。我试图解决这个问题让事情变得更糟。

最初,我有:

  A <-- master
   \
    B <-- abstract-test-rule
     \
      C <-- run-leaf

我将abstract-test-rulerun-leaf推送到我的公共github存储库,并为每个存储库发出拉取请求。然后我意识到“run-leaf”包括提交B;我本来打算从“A”分支“run-leaf”。所以我在分支“run-leaf”上运行git revert B

  A <-- master
   \
    B <-- abstract-test-rule
     \
      C--B' <-- run-leaf

我将“run-leaf”重新推送到我的公共github存储库。

问题1:我该怎么办?我猜测正确的事情是从A创建一个新的分支,只有来自commit C的de​​lta,将其推送到我的公共github存储库,取消之前的pull请求并创建一个新的。最简单的方法是什么?

不幸的是,分支“run-leaf”被合并到父存储库from commit C中,然后B' was merged合并到父存储库中。

我知道“抽象测试规则”的合并现在对于父存储库的所有者来说是痛苦的,所以我尝试为合并准备“抽象测试规则”。这时我的回购看起来像这样:

  A <-- master
   \
    B--D--E <-- abstract-test-rule
     \
      C--B' <-- run-leaf

我进入了我的仓库,从父仓库撤回到“主人”,然后将“主人”合并为“抽象测试规则”。合并是一团糟(因为,我猜,我正在将父级回购的B版本合并为“抽象测试规则”)。毕竟,我们有一些very confusing diffs

问题2:我是否有更简单的方法来清理“抽象测试规则”?换句话说,我想将“master”合并为“abstract-test-rule”,但是避免将我的父级repo的B'版本合并为“abstract-test-rule”

问题3:验证与父存储库的合并是否正确完成的最佳方法是什么?现在,我只是从父存储库中提取,将我的分支版本与“master”合并(查看合并中的差异)并运行git diff master以验证分支现在与“master”相同

谢谢!

1 个答案:

答案 0 :(得分:2)

  

问题1:我该怎么办?我猜测正确的事情是从A创建一个新的分支,只有来自commit C的de​​lta,将其推送到我的公共github存储库,取消之前的pull请求并创建一个新的。最简单的方法是什么?

这取决于是否有人已撤消您的更改。如果没有人撤消您的更改,您可以删除分支并重新创建一个包含所需提交的新分支。如果您的更改进入另一个仓库,则只能git revert不需要的提交。作为一项规则,如果你发布了分支,它对git revert更安全,因为在大多数情况下你不能确定没有人拉出不需要的分支。

编辑:变更集移植

您可以通过

创建仅包含C变更集的新分支
git checkout -b newbranch A # <- branch name or commit-id
git cherry-pick SHA1(C) # repeat for every wanted commit

git checkout -b newbranch run-leaf
git rebase -i HEAD~10 # large-enough number to include every commit you want
                      # to strip, and remove every unwanted commit in the editor

两种方式都只创建一个只需要提交的新分支。

  

问题2:我是否有更简单的方法来清理“抽象测试规则”?换句话说,我想将“master”合并为“abstract-test-rule”,但是避免将我的父级repo的B'版本合并为“abstract-test-rule”

只要未发布更改,您就可以git rebase -i分支历史记录。发布更改后,您无法编辑历史记录。

修改

由于您的更改已经展开,因此建议的方法是还原更改集。您也可以使用交互式rebase对不需要的变更集进行条带化,git push -f这会更改,但每个其他拉出旧分支的人都可能会在下一次回购时遇到麻烦。有关详情,请参阅this SO questiongit docs

  

问题3:验证与父存储库的合并是否正确完成的最佳方法是什么?现在,我只是从父存储库中提取,将我的版本的分支从“master”合并(查看合并中的差异)并运行git diff master以验证分支现在与“master”相同

您可以进行合并,以便上游开发人员可以快速合并。这样,上游开发人员不会自己合并,而是使用您准备好的合并。