【问题标题】:Back out a commit to origin/master撤销对 origin/master 的提交
【发布时间】:2014-03-13 07:43:35
【问题描述】:

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

我在 GitHub 上有我的 master,在我的开发系统上有本地 master 和 tracking 分支。我的 QA 系统上也有大师。

在我的开发系统上,我提交了本地分支并将其合并到(本地)master 中,然后将 master 推送到 GitHub 的 origin/master。然后,我把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 主控...实际上,退出整个合并。然后,我想把分支(不是master)推送到GitHub,然后把分支拉到QA。

  1. 如何在 QA 和 GitHub 上恢复大师?
  2. 我是否还需要在开发过程中恢复主节点?
  3. 如何保留我在开发中所做的分支更改?

请帮忙?

【问题讨论】:

    标签: git github git-revert


    【解决方案1】:

    你应该推送一个分支而不是合并到 master 吗?

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

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

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

    假设master在B,C&D在your_branch上。 E 是两者的合并提交。关于你的问题。您可以通过修复本地存储库来恢复 GitHub 和 QA 上的 master,然后强制 GitHub 特别匹配它。所以实际上你的问题最好以相反的顺序回答。

    首先我们修复 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 上的 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
    

    【讨论】:

    • 抱歉,回复延迟太久。你的指示就像一个魅力。当然,我已经简化了情况以使问题清楚。我花了一段时间才在我的实际 git 历史记录中找到与您回复中的重置点“D”和“B”相对应的正确点。我还使用了@miqid 提到的“stash”命令——这让我更有信心,如果我重置到错误的点,我可以恢复。而且,正如你猜到的,这个提交是“高度实验性的”。以前推master也有效果,这次就不好了。
    【解决方案2】:

    对我来说,最初的问题似乎是个人工作流程偏好的问题,即您是否希望开发分支在到达 QA 系统时已经合并到 master 中。至于你目前的困境,我的(不一定是最好的)建议:

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

    希望你觉得这很有用。

    【讨论】:

    • 感谢“隐藏”提示。这是一个有价值的安全网,我使用了它。
    猜你喜欢
    • 2010-09-19
    • 2015-01-10
    • 2011-03-26
    • 1970-01-01
    • 2013-07-14
    • 2013-04-23
    • 2021-05-19
    • 2016-10-24
    • 2012-04-27
    相关资源
    最近更新 更多