2014-02-14 41 views
0

我对git比较陌生,我想我打破了我的主人。希望有人能帮我解开它。退出承诺起源/主

我在GitHub上有我的主人,我的开发系统上有本地主人和跟踪分支。我也有我的QA系统的主人。

在我的开发系统上,我提交了本地分支,并将它合并到(本地)主设备中,然后将主设备推送到GitHub的origin/master。然后,我把主人带到QA系统。然后,我对本地分支做了一些进一步的修改。

我所做的是:

dev branch -- merge --> dev master 
dev master -- push --> GitHub master -- pull --> QA master 

我想我应该做的:

dev **branch** -- push --> GitHub **branch** -- pull --> QA **branch** 

是吗?

现在:我想在提交之前恢复QA和GitHub主...实际上,退出整个合并。然后,我想将分支(而不是主分支)推到GitHub上,并将分支拉到QA。

  1. 如何恢复对QA和GitHub上的主人?
  2. 我是否还需要恢复开发者?
  3. 如何保留我在开发中进行的分支更改?

请帮忙吗?

回答

1

如果你推送了一个分支,而不是合并到主?

这是一个很好的问题。如果提交是高度实验性的,那么推动分支可能会更好。否则,如果你对提交有很高的信心,那么合并到主人是正确的。如果您不需要,无需使用远程分支来污染您的工作区。

假设您想要将此提交切换到分支并远程推送。我就画一个图形提交了这样的场景:

A-C-D 
\ \ 
    B---E < master, your_branch 

比方说,主人在B和C & d,其中上your_branch制造。 E是两者的合并提交。在你的问题上。通过修复本地存储库,然后强制GitHub特别匹配它,您可以在GitHub & QA上恢复主服务器。所以实际上你的问题最好以相反的顺序回答。

我们首先解决your_branch

git checkout your_branch 
git reset --hard D 

这将移动分公司d,产生:

A-C-D < your_branch 
\ \ 
    B---E < master 

现在,我们解决当地发展总体

git checkout master 
git reset --hard B 

哪得到:

A-C-D < your_branch 
\ 
    B < master 

再见,不需要合并提交E.

修复GitHub上(和QA)

git checkout master 
git push -f 

这将迫使主GitHub上回B.如果你用合作其他开发者,他们会因为你重写历史而讨厌这个。但是,由于这可能是你的个人存储库没有合作,所以去做吧。现在做一个远程分支:

git checkout your_branch 
git push origin your_branch 

现在GitHub上已经固定,以配合发展,更新QA应该是一个简单:

git checkout master 
git pull 
git reset --hard origin/master # I'm assuming master will be on an orphaned commit after the pull 
+0

对不起,在响应长时间的延迟。你的指示很有魅力。当然,我已经简化了情况,使问题清楚。在我的实际git历史记录中找到正确的点,并在响应中对应重置点“D”和“B”,花了我一段时间。 我还使用了@miqid提到的“隐藏”命令 - 这给了我更大的信心,如果我重置到错误的点,我可以恢复。 而且,正如你猜测的那样,这个提交是“高度实验性的”。推动大师以前工作,但这次是一个坏主意。 –

+0

很高兴它工作得很好! –

0

对我而言,最初的问题似乎是个人工作流程偏好的问题,您是否希望开发分支在达到质量保证体系时已经合并到主体中。至于你目前的困境,我的(不那么一定是最好的)建议:

  1. 在当地的主人,git revert <merge-commit>,恢复您的开发分支合并带来的变化。向上推本地主机。把这个交给QA。在此之后,掌握所有存储库应该处于相同的历史状态。
  2. 根据上述观点,为了保持资料库的一致性,我会这样做,是的。
  3. 在进行恢复之前,请保存您的更改(参见git stash)。完成整个恢复过程后,弹出更改(参见git stash pop)。

希望你觉得有用。

+0

谢谢你的“藏匿”提示。这是一个有价值的安全网,我用它。 –