协慌网

登录 贡献 社区

将远程重置为特定提交

我想放弃所有在提交<commit-hash>之后所做的更改。所以我做了:

git reset --hard <commit-hash>

现在,我想对遥控器执行相同的操作。我怎样才能做到这一点? <commit-hash>之后做了一些提交(和推送),我只想丢弃它们。只是方式出了什么问题而已,我不想让它变得比现在更糟。 ;(

我基本上想将我的origin/master倒带到<commit-hash>

答案

假设您的分支master ,并且您的远程被称为origin ,则可以执行以下操作:

git reset --hard <commit-hash>
 git push -f origin master

但是,如果其他人正在使用远程存储库并撤消更改,则应避免这样做。在这种情况下,最好还原不需要的提交,然后按正常方式推送。

更新:您已经在下面说明其他人撤消了您已推送的更改,因此最好创建一个新的提交以还原所有这些更改JakubNarębski 的回答中有一个很好的解释,说明了您可以执行此操作的选项。哪一个最方便取决于您要还原的提交数量,以及哪种方法对您最有意义。

由于从您的问题中可以很明显地看出您已经使用git reset --hard来重置master分支,因此您可能需要使用git reset --hard ORIG_HEAD开始将分支移回之前的位置。 (与git reset --hard ,请确保git status干净,位于正确的分支上,并且知道git reflog是用于恢复显然丢失的提交的工具。)您还应该检查一下ORIG_HEAD指向正确的提交, git show ORIG_HEAD

故障排除:

如果收到类似 “ ![远程拒绝] a60f7d85-> master(预接收挂钩被拒绝) ” 的消息

那么您必须允许为特定分支重写分支历史记录。例如,在 BitBucket 中,它说 “不允许重写分支历史记录”。有一个名为 “ Allow rewriting branch history的复选框,您必须检查它。

如果您不介意丢失本地更改,请使用其他答案。如果您选择了错误的提交哈希值,该方法仍然会破坏您的遥控器。

如果您只想使远程匹配成为本地存储库中任何位置的提交,请执行以下操作:

  1. 不要做任何复位。
  2. 使用git log查找您要对远程进行的提交。 git log -p查看更改,或git log --graph --all --oneline --decorate查看紧凑的树。
  3. 复制提交的哈希值或其标记,或者复制提示的分支名称。
  4. 运行如下命令:

    git push --force <remote> <commit-ish>:<the remote branch>

    例如

    git push --force origin 606fdfaa33af1844c86f4267a136d4666e576cdc:master

    或者

    git push --force staging v2.4.0b2:releases

我使用方便的别名( git go )来查看历史记录,如步骤 2 所示,可以这样添加:

git config --global alias.go 'log --graph --all --decorate --oneline'`

我通过以下命令解决了像您这样的问题:

git reset --hard <commit-hash> 
git push -f <remote> <local branch>:<remote branch>