撤销对 origin/master 的提交

Posted

技术标签:

【中文标题】撤销对 origin/master 的提交【英文标题】:Back out a commit to 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。

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

请帮忙?

【问题讨论】:

【参考方案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 中。至于你目前的困境,我的(不一定是最好的)建议:

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

希望你觉得这很有用。

【讨论】:

感谢“隐藏”提示。这是一个有价值的安全网,我使用了它。

以上是关于撤销对 origin/master 的提交的主要内容,如果未能解决你的问题,请参考以下文章

git - 您的分支领先于 'origin/master' 1 次提交

提交代码出现 Push to origin/master was rejected 错误解决方法

撤消 git reset --hard origin/master [重复]

git push origin master 遇到的分支问题

提交项目到gitee报错Push to origin/master was rejected的解决办法

git 看不到他人提交的远程分支解决