首页 > 解决方案 > 远程集线器拒绝强制推送时怎么办?

问题描述

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

所以这就是发生的事情:

我在当前工作分支上编辑了大约 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

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

在这种情况下我应该怎么做?虽然我很确定这些文件已经永远消失了,但我有什么希望可以恢复这些更改吗?

标签: gitgitlabgit-resetgit-amend

解决方案


最好的办法是存储未提交的更改文件。像这样的东西:

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),如果您并行处理不同的主题,则可以有多个存储。阅读更多关于stash的信息。

除此之外,您还可以进行软重置或正常重置。这样您就不会丢失本地更改。阅读有关该主题的更多信息。

如果没有完成,我建议阅读git 书并查看dangitgit以了解一些复杂的故障排除,两者都是免费的。


推荐阅读