git - 远程集线器拒绝强制推送时怎么办?
问题描述
好的,所以这是事后的问题,我只想知道我应该做什么,以便将来避免这个问题。是的,我意识到强制推动是一个危险的命令。是的,我意识到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
而且,我相信您已经猜到了,我丢失了所有尚未提交提交的文件。脸...
在这种情况下我应该怎么做?虽然我很确定这些文件已经永远消失了,但我有什么希望可以恢复这些更改吗?
解决方案
最好的办法是存储未提交的更改文件。像这样的东西:
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的信息。
除此之外,您还可以进行软重置或正常重置。这样您就不会丢失本地更改。阅读有关该主题的更多信息。
推荐阅读
- jquery-ui - 了解 jQuery UI 按钮小部件
- javascript - 无法使用 webpack 4 转换 .marko 文件
- java - 如何使用 lambda 表达式创建满足条件的数组列表
- highcharts - Highchart Y 轴刻度值缺失
- bash - 丢失时在文件末尾添加分号
- java - maven 复制依赖与定义依赖
- c++ - 如何使用 libgit2 编写正确的 git pull
- java - 当我合并使用 Log4j 2 的库时,java.util.logging 停止工作
- selenium - 无法使用 Python 和 Selenium 自动点击
- atom-editor - 在 Atom.io 中替换括号和回车符之间的文本