我知道这个问题已被多次询问过。但我的情况有所不同。我有两个分支,主人和发展。我从不接触主分支,但我错误地将整个数据推送到主分支。当我运行以下命令时,我在我的开发分支上。
git push origin development:master
我使用上面的命令推动了我的整个开发提交。该命令中包含“冒号”,可能会替换我的代码。
根据本文Ref:Why Git use the colon (:<branch>) to delete remote branch,它取代了代码。
我该如何还原呢?
答案 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
,但如果你做错了,你就会立即激怒你的同事。