代码之家  ›  专栏  ›  技术社区  ›  Bryan Watson

撤销对原始/主的承诺

  •  0
  • Bryan Watson  · 技术社区  · 12 年前

    我对git比较陌生,我想我把我的主人弄坏了。希望有人能帮我解开它。

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

    在我的开发系统上,我提交了我的本地分支,并将其合并为(本地)master,然后在GitHub将master推送到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. 如何保存我在开发中所做的分支更改?

    请帮忙?

    2 回复  |  直到 12 年前
        1
  •  1
  •   Mike Monkiewicz    12 年前

    您应该推送分支而不是合并到主分支吗?

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

    让我们假设您希望将此提交切换到一个分支并远程推送它。我将为此场景绘制一个提交图:

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

    让我们假设master在B,而C&D是在你的农场做的。E是两者的合并提交。继续你的问题。您可以在GitHub上还原master&通过修复本地存储库,然后强制GitHub与之匹配来进行QA。所以实际上,您的问题最好以相反的顺序回答。

    首先我们修复您的分支(_B)

    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上的master返回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
    
        2
  •  0
  •   miqh    12 年前

    对我来说,最初的问题似乎是个人工作流偏好的问题,即您是否希望开发分支在进入QA系统时已经合并为主分支。对于您当前的困境,我(不一定是最好的)建议:

    1. 在您的本地主机中, git revert <merge-commit> ,还原开发分支合并所引入的更改。将本地主机向上推。将其转交给QA。在此之后,所有存储库中的master都应该处于相同的历史状态。
    2. 根据上述观点,为了保持存储库的一致性,我会这样做,是的。
    3. 在进行还原之前,隐藏您的更改(参见。 git stash ). 完成整个还原过程后,弹出更改(参见。 git stash pop ).

    希望你觉得这很有用。

    推荐文章