将 GIT HEAD 还原为旧提交

revert GIT HEAD to older commit

我意识到我已经将错误的内容提交到我的分支中,我想恢复到之前的提交。我已经确认 git checkout 8dd018c 将我带到了我想将 HEAD 恢复到现在的早期提交,我尝试了以下操作:

git checkout 8dd018c
git status
HEAD detached at 8dd018c
nothing to commit, working directory clean
git reset --hard  8dd018c
git push origin HEAD:<my_branch>

但得到了:

 ! [rejected]        HEAD -> my_branch (non-fast-forward)
error: failed to push some refs to 'https://github.com/my/repository.git'
hint: Updates were rejected because a pushed branch tip is behind its remote
hint: counterpart. Check out this branch and integrate the remote changes
hint: (e.g. 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

如何正确执行此操作?我不是唯一一个在这个存储库上工作的人所以我认为 push -f 是不可能的,是吗?

so I think push -f is out of the question, is it?

不管是不是出问题了。 不可能在不使用武力的情况下做你想做的事情,因为你要求远程丢弃它对 8dd018c 之后所有提交的引用,并且它不会心甘情愿的。

不过,放心吧,因为:

  • 没有其他人依赖这个分支;是你的。

  • 您可以推送 --force-with-lease,这意味着,"Please do as I'm telling you to do, but only as long as it is safe"(在没有其他人推送到您的分支的意义上是安全的,因为它是您的分支非常有保证)。

  • 你可以不费吹灰之力解决整个问题,只要完全放弃这个分支。毕竟只是一个名字而已。因此,在 8dd018c 处以 different 名称开始一个新分支,然后推送 that 分支。遥控器会很乐意让你这样做。当然,你也想删除旧的分支,同样,这将需要你以一种或另一种方式使用强制。

  • 您可以通过 revert 提交不费力地解决整个问题。您不是删除提交,而是添加一个 new 提交,使您的 code 返回到与 [=11= 时相同的状态].实际上,我认为这是我最喜欢的解决方案。当然,错误代码保留在您已经推送的提交中,但谁在乎呢?人是会犯错的。

基本上,如果您要将分支推送到共享远程,您将 运行 陷入此类问题,您需要让自己适应它。我个人非常喜欢在推送之前重写我的分支的历史记录,这意味着我不想推送它,直到我很好地真正完成它。如果我担心我的计算机可能会被公交车撞到,我可以做一个备份,或者我什至可以添加第二个遥控器并将分支推送到那个。其他人更愿意将他们的分支推送到共享远程并使用 force 更改其历史记录。这是你应该和你的团队讨论的事情。

您可以轻松完成的方法是:

git checkout old-commit
git reset --soft the-branch
git commit -m "Going back in time"
# now you are one revision on top of the-branch but content is like old-revision
# if you like the result
git branch -f the-branch # set branch where you are now
git checkout the-branch

现在您可以推送内容了。