2011-01-12 72 views
0

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

起初,我有:

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

我推abstract-test-rulerun-leaf我的公开GitHub的仓库,并提出了各自引入请求。然后我意识到“run-leaf”包含提交B;我本来打算从“A”分支“run-leaf”。所以,我对分支“跑叶”跑git revert B

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

我重新推“跑叶”我的公开的github仓库。

问题1:我应该做些什么?我猜测正确的做法是从A创建一个新的分支,只有提交C的增量,推送到我的公共github存储库,取消之前的请求并创建一个新的分支。最简单的方法是什么?

不幸的是,分支“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:有没有更简单的方法来清理“抽象测试规则”?换句话说,我想合并的“主人”到“抽象测试规则”,但避免合并B的”我的父母回购的版本为‘抽象测试规则’

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

谢谢!

回答

2

问题1:我该怎么做?我猜测正确的做法是从A创建一个新的分支,只有提交C的增量,推送到我的公共github存储库,取消之前的请求并创建一个新的分支。最简单的方法是什么?

这取决于是否有人已经拉动您的更改。如果没有人拉你的修改,你可以删除分支并用想要的提交重新创建一个新分支。如果您的更改进入另一个回购,您只能提交git revert不需要的提交。一般来说,如果您发布了分支,那么对于git revert更安全,因为在大多数情况下,您无法确定没有人拉动不需要的分支。

编辑:变更移栽

您可以通过

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 

两种方式创建一个新的分支,只有创建一个新的分支只有C变更想要的提交。

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

只要这些更改不是发布,你可以git rebase -i分支的历史。更改发布后,您无法编辑历史记录。

编辑

当你的变化已经传播出去,所以恢复的变更是推荐的方式。您也可以使用交互式底图区分出不需要的变更集,并且git push -f这一变化,但其他谁拉动了旧的分支可能会在您的回购下一次拉动时遇到麻烦。有关详细信息,请参阅this SO questiongit docs

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

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

+0

澄清,对于问题2,更改B'已发布到我的回购(在分支运行叶),然后拉入上游回购(进入主分支)。对于问题3,我想验证上游开发者是否正确合并(尽管我试图让我的分支保持新鲜,但其他更改仍然存在合并冲突) – NamshubWriter 2011-01-13 14:28:08