撤消上次快进到远程推送

时间:2014-07-03 14:41:59

标签: git

我知道这个问题已被多次询问过。但我的情况有所不同。我有两个分支,主人和发展。我从不接触主分支,但我错误地将整个数据推送到主分支。当我运行以下命令时,我在我的开发分支上。

git push origin development:master

我使用上面的命令推动了我的整个开发提交。该命令中包含“冒号”,可能会替换我的代码。

根据本文Ref:Why Git use the colon (:<branch>) to delete remote branch,它取代了代码。

我该如何还原呢?

3 个答案:

答案 0 :(得分:2)

git push -f origin master:master

答案 1 :(得分:2)

您使用的此命令,

git push origin development:master

使用本地开发分支更新远程主分支,或者换句话说,它将开发快速合并到远程主分支上。

它不会“替换”主分支上的工作,因为它不是强制推送--force-f选项。

解决方案

您可以尝试强制将主分支推送到远程。请注意,如果另一个用户已将其他工作推送到主分支,因为您将其快速转发到开发分支,那么强制推送将覆盖该用户的工作。但是,如果这项工作是基于开发分支而不是主分支,那么在我看来它已经是无效的了。

您可以使用

强制推送
git push origin master -f

如果您觉得在强制推动时必须非常安全,以免过度写别人的推动,那么您可以使用--force-with-lease(自Git版本1.8.5起?)

git push origin master --force-with-lease

如果主分支仍处于您上次推送时的状态(预期状态,基于您的本地远程跟踪分支)。 请注意,如果您使用git fetch更改远程跟踪分支,则需要将其他(已记录的)选项传递给--force-with-lease才能正确执行此操作。

如果有人碰巧在此之前推动了新工作,那么主分支将不会处于“预期状态”,并且强制推送将被拒绝,作为安全功能。

当然,如果有人已经将你的意外推送到他们当地的回购中,那么他们可能仍然需要在你强迫推送的时候重新开始他们的新工作,如果他们的新工作基于意外提交。

替代解决方案

而不是强制推动主分支的先前状态,您可以选择恢复提交,以防您无法强制推送主分支(例如,如果您根本无法覆盖推送到主分区的新提交,即使发展被意外合并)。 但是,一旦您准备好在开发分支中实际合并,您将需要还原上次还原所做的更改,以便还原master中开发分支的完整更改。 / p>

我不会在这里详细讨论这个解决方案,因为它在

中有详细记录

答案 2 :(得分:1)

你的问题的标题有点误导,所以这里是如何撤消你并不特别关心的最新的合并提交,如果有人通过谷歌绊倒了这个。看看这个提交:

如果我刚刚制作这个合并并且我想要还原它,我需要知道的是上面列出的两个“头”(我已经合并的时间轴),总是以原始开头 - 订单是“我的,他们的”。

所以,为了让它消失,我想要运行的命令是:

git reset 05ace60

将我的分支重置为此合并之前的时间轴。如果你在旧的合并上使用它,你将肯定失去提交,只在你刚刚撤消的未刷新的合并上使用它。 (在紧要关头,你可以重置,然后git push -f origin master,但如果你做错了,你就会立即激怒你的同事。