强制推送被remote hub拒绝怎么办?

What to do when force pushing is denied by remote hub?

好的,所以这是事后的问题,我只是想知道我应该做什么,以便将来避免这个问题。是的,我知道用力推动是一个危险的命令。是的,我意识到 git reset HEAD --hard 也可能是一个危险的命令。请帮我避免这个问题,这个问题让我今天工作了 ~4 个小时。

事情是这样的:

我在当前工作的 b运行ch 上编辑了大约 6 个文件。其中 3 个文件我还没有准备好提交,所以我将其中 3 个文件暂存并打包到一个提交中,并将它们推送到我的远程。这让我在本地留下了 3 个未暂存的文件,其中包含我的大部分工作。

推送后不久,我发现我在刚刚推送的其中一个文件中犯了一个小错字。因此,我没有为错字添加另一个提交,而是尝试修改我的最后一次提交并强制推送。然后我收到这个错误:

remote: GitLab: You are not allowed to force push code to a protected branch on this project.

我相信这是我们企业 GitLab 服务器的维护者最近所做的全局更改。

现在,这是我维护的个人回购协议;因此,为什么我毫不犹豫地强行推动。尤其是当这只是一个微小的变化,并且没有其他人的本地 git 历史记录会因为推送而变得混乱时。

但现在我陷入了困境。我在我的本地机器上有这个修改后的提交,我永远无法推送到远程。所以我想我需要重新设置,这样我就可以为错字添加一个额外的提交。所以我 运行:

git reset HEAD~1 --hard

而且,我相信您已经猜到了,我丢失了所有尚未准备提交的文件。 捂脸...

遇到这种情况我应该怎么办?虽然我很确定这些文件已经永远消失了,但我是否有希望恢复这些更改?

最好是隐藏未提交的更改文件。像这样:

git status
# Shows 6 files uncommited changes
git add file1 file2 file3
git commit -m "Update file 1, 2, 3"
git push origin feature-branch-123
git status
# Shows 3 files uncommited changes
# work, work, work, ...
# notice forgot something in file1
git add file1
git commit --amend --no-edit
git push origin feature-branch --force-with-lease
# returns remote: GitLab: You are not allowed to force push code to a protected branch on this project.

# Now the difference:
# before reset, stash changes
git stash push
git status
# no local changes detected
git reset HEAD~1 --hard
# restore stashed changes
git stash apply
git status
# Shows 3 files uncommited changes

存储也适用于未跟踪的文件 (-u),如果您同时处理不同的主题,您可以拥有多个存储。详细了解 stashing

除此之外,您还可以进行软重置或正常重置。这样你就不会丢失你的本地更改。在 topic.

上阅读更多内容

如果没有完成,我建议阅读 git book and take a look at dangitgit 以了解一些复杂的故障排除,两者都是免费的。