首页 > 解决方案 > 误推master后如何恢复

问题描述

我经常犯这个错误,我想知道是否有更好的解决方案,以及我当前的解决方案是否有风险。

这是工作流程

  1. git结账大师
  2. git 拉
  3. git 子模块更新 --init --recursive
  4. (编辑、调试、测试)
  5. git 提交 -a
  6. git push origin HEAD:refs/for/master
  7. (更多编辑、测试等)
  8. git 提交 -a
  9. 吉特克
  10. (咒骂)
  11. git rebase -i HEAD~2 # 选择并压缩我的两个提交
  12. git checkout -b task_id
  13. git结账大师
  14. git rebase -i HEAD~2 # 选择前一个用户的提交,删除我自己的

我的错误是,在第 5 步附近的某个地方,我应该执行第 12 步之类的操作来创建一个新分支,以使这项工作与其他所有任务分开,让我可以轻松地回到它或以所需的顺序重新设置不同的补丁或其他任何东西. 相反,我将新代码推送到 master 分支上,大约在第 10 步左右,我意识到这master不再指向公司批准的最新和最好的代码版本,而是我自己的努力。因此,在将我自己的提交压缩成一个交互式rebase之后,我正在做另一个交互式rebasemaster指出它应该在哪里——即,其他人的工作已经通过了审查过程。

编辑澄清:当我“推动掌握”时,这不会将我的更改发布给其他人。有一些提交钩子魔术可以创建 Gerrit 代码审查任务,只有在获得批准时,我的提交才会合并到远程存储库中。为误导大家道歉。我在这里关心的只是我的本地回购。

我的问题是双重的。就风险而言,这种做法有多糟糕,如何改进?我不是在寻求帮助来避免最初的错误。我想我只需要更加小心我要推送到哪个分支。问题是如何在不干扰/冒险/丢失任何东西的情况下最好地指向master先前的提交。

标签: git

解决方案


如果您只推送了一次提交,则可以执行以下操作:

git checkout master
git reset --hard HEAD~
git push -f

这会将 master 恢复到之前的提交。如果您进行了更多提交,您可以替换HEAD~为任何其他提交(SHA1 哈希、分支名称、标签名称等)。

我的错误是,在第 5 步附近的某个地方,我应该执行第 12 步之类的操作

我建议在第 4 步,在进行任何编码之前,先创建一个新分支。这里不应该有歧义。典型的最佳实践是创建一个新的功能分支,以便继续单独工作,并且只有在工作完成后才将其合并到 master 中。在 master 上提交一半完成的工作将使您的软件不稳定且难以发布。


推荐阅读