我遇到了一个问题,我向我的公共git存储库发布了一个错误的父分支的分支。我试图解决这个问题让事情变得更糟。
最初,我有:
A <-- master
\
B <-- abstract-test-rule
\
C <-- run-leaf
我将abstract-test-rule和run-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的delta,将其推送到我的公共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”相同
谢谢!
答案 0 :(得分:2)
问题1:我该怎么办?我猜测正确的事情是从A创建一个新的分支,只有来自commit C的delta,将其推送到我的公共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 question和git docs。
问题3:验证与父存储库的合并是否正确完成的最佳方法是什么?现在,我只是从父存储库中提取,将我的版本的分支从“master”合并(查看合并中的差异)并运行git diff master以验证分支现在与“master”相同
您可以进行合并,以便上游开发人员可以快速合并。这样,上游开发人员不会自己合并,而是使用您准备好的合并。