我意识到我在分支中提交了一些不好的东西,我想恢复到之前的提交。我已经确认 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
是不可能的,是吗?
所以我想
push -f
是不可能的,是吗?
出不出题并不重要。它是... 不可能 来做你想做的事,而不需要使用武力,因为你要求远程丢弃它在 8dd018c
但它不会心甘情愿地这样做。
不过,你可以放心,因为。
没有人依靠这个分支,它是你的。
你可以推 --force-with-lease
,意思是说:"请你按照我说的去做,但前提是安全"(安全的意思是没有人推到你的分支,既然是你的分支,那就很好保证了)。
你只要完全放弃这个分支,就可以不费吹灰之力地解决整个问题。毕竟,这只是一个 名称. 因此,开始一个新的分支与 不同 名为 8dd018c
,并推动 该 分支。远程会很乐意让你这么做。当然,你还想删除旧的分支,同样,这需要你以某种形式使用武力。
你可以在不使用武力的情况下解决整个问题,用一个 revert
提交。您不需要删除提交,而是添加一个 新的 使你 编码 倒退回当初的状态。8dd018c
. 实际上,我认为这是我最喜欢的解决方案。当然,坏的代码会留在你已经推送的提交中,但谁在乎呢?人们确实会犯错。
基本上,如果你要推送一个分支到共享的远程,你会遇到这种问题,你需要协调好自己的关系。我个人非常喜欢在推送之前改写我的分支的历史,这意味着我不想推送它,直到我很好地完成它。如果我担心我的电脑会被总线撞到,我可以做一个备份,甚至我可以添加第二个远程,然后把分支推送到那个地方代替。其他的人则会更谨慎地将他们的分支推送到共享的远程服务器上,然后用以下方法改变它的历史记录 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
现在你可以推和东西。