代码之家  ›  专栏  ›  技术社区  ›  dylanjm

当远程集线器拒绝强制推送时该怎么办?

  •  0
  • dylanjm  · 技术社区  · 3 年前

    好吧,这是一个事后问题,我只想知道我应该做什么,这样我就可以避免将来出现这个问题。是的,我意识到强行推进是一种危险的命令。是的,我知道 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
    

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

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

    0 回复  |  直到 3 年前
        1
  •  1
  •   Chris    3 年前

    最好的办法是将未调试的更改文件藏起来。像这样的东西:

    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
    

    Stashing也适用于未跟踪的文件( -u )如果你同时处理不同的主题,你可以有多个隐藏。阅读更多关于 stashing .

    除此之外,您还可以进行软重置或正常重置。这样你就不会丢失你当地的零钱。在上阅读更多信息 topic .

    如果没有完成,我建议阅读 git book 看看 dangitgit 对于一些复杂的故障排除,两者都是免费的。