Git reset --hard和一个远程存储库

rob*_*ill 193 git

我有一个存储库,它有一些不好的提交(本例中为D,E和F).

ABCDEF主和原点/主

我专门用一个修改了本地存储库git reset --hard.我在重置之前选了一个分支,所以现在我有一个看起来像的回购:

A-B-C master  
     \ D-E-F old_master

A-B-C-D-E-F origin/master
Run Code Online (Sandbox Code Playgroud)

现在我需要这些糟糕提交的一些部分,所以我选择了我需要的位并做了一些新的提交,所以现在我在本地有以下内容:

A-B-C-G-H master
     \ D-E-F old_master
Run Code Online (Sandbox Code Playgroud)

现在我想把这种状态推到远程仓库.但是,当我尝试做一个git pushGit时,礼貌地给我刷掉了:

$ git push origin +master:master --force  
Total 0 (delta 0), reused 0 (delta 0)  
error: denying non-fast forward refs/heads/master (you should pull first)  
To git@git.example.com:myrepo.git  
! [remote rejected] master -> master (non-fast forward)  
error: failed to push some refs to 'git@git.example.com:myrepo.git'  
Run Code Online (Sandbox Code Playgroud)

如何让远程仓库获取本地仓库的当前状态?

Jak*_*ski 277

如果强制推送没有帮助(" git push --force origin"或" git push --force origin master"应该足够),则可能意味着远程服务器通过receive.denyNonFastForwards配置变量拒绝非快进推送(请参阅git config手册页以获取描述),或者通过更新/预接收挂钩.

使用较旧的Git,您可以通过删除" git push origin :master"(参见分支名称前的':')然后重新创建" git push origin master"给定分支来解决该限制.

如果你不能改变这个,那么唯一的解决方案就是不是重写历史记录来创建一个恢复 DEF变化的提交:

A-B-C-D-E-F-[(D-E-F)^-1]   master

A-B-C-D-E-F                             origin/master

  • 我可以证明```git push --force origin master```可以起作用并且让我很头疼. (5认同)
  • @JakubNarębski,谢谢.`得到恢复HEAD~N`帮助.`N`是提交的数量.例如,如果我需要先前的提交,我将使用`git revert HEAD~1` (2认同)
  • 请注意,这样做会破坏其他所有本地大师。 (2认同)

Jea*_*lie 24

为了补充Jakub的答案,如果你可以访问ssh中的远程git服务器,你可以进入git远程目录并设置:

user@remote$ git config receive.denyNonFastforwards false
Run Code Online (Sandbox Code Playgroud)

然后返回您当地的仓库,再次尝试执行以下提交--force:

user@local$ git push origin +master:master --force
Run Code Online (Sandbox Code Playgroud)

最后在原始受保护状态下恢复服务器的设置:

user@remote$ git config receive.denyNonFastforwards true
Run Code Online (Sandbox Code Playgroud)


Jas*_*ner 15

对于 GitHub 的用户,这对我有用:

  1. 在您希望进行更改的任何分支保护规则中,确保启用了允许强制推送
  2. git reset --hard <full_hash_of_commit_to_reset_to>
  3. git push --force

这将“更正”您本地计算机和 GitHub 服务器上的分支历史记录,但是任何因为错误提交而将此分支与服务器同步的人都将在其本地计算机上拥有该历史记录。如果他们有权直接推送到分支,那么这些提交将在同步时正确显示。

所有其他人需要做的就是git reset上面的命令来“纠正”他们本地机器上的分支。当然,他们需要警惕在目标哈希之后对该分支进行的任何本地提交。Cherry Pick/backup 并在必要时重新应用那些,但如果你在一个受保护的分支中,那么可以直接提交给它的人数可能是有限的。