重置远程某个提交

我想放弃提交<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 

但是,如果其他人正在使用远程存储库并已经完成了更改,则应该避免这样做。 在这种情况下,最好还原不需要的提交,然后像平常一样推送。

更新:您已经在下面解释过,其他人已经撤消了您所推送的更改,因此最好创build一个新的提交来恢复所有这些更改。 JakubNarębski在这个答案中提供了一个很好的解释。 哪一个最方便取决于你想要恢复的提交数量,以及哪个方法对你最有意义。

由于从你的问题很明显,你已经使用git reset --hard来重置你的master分支,你可能需要开始使用git reset --hard ORIG_HEAD将分支移回原来的位置。 (一如git reset --hard ,确保git status是干净的,你在右边的分支,你知道git reflog作为一个工具来恢复显然丢失的提交。)你还应该检查ORIG_HEAD指向正确的提交,用git show ORIG_HEAD

我通过这个命令解决了你的问题:

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

如果您不介意丢失本地更改,请使用其他答案。 如果您select了错误的提交哈希来返回,该方法仍然可以破坏您的远程。

如果您只想让远程匹配已经在您的本地分支中进行提交:

  1. 不要做任何重置。
  2. 使用git log来查找你想要的远程提交的散列。 git log -p查看更改,或者git log --graph --all --decorate查看树。 (把最后一个作为shell的别名非常方便。)
  3. 复制哈希。
  4. 运行一个命令,如:

     git push --force <remote> <the-hash>:<the remote branch> 

    例如

     git push --force origin 606fdfaa33af1844c86f4267a136d4666e576cdc:master 

我的两个分钱给以前的答案:如果

 git push --force <remote> <the-hash>:<the remote branch> 

仍然不起作用,您可能需要编辑<your-remote-repo>.git/config文件的接收部分:

 [receive] #denyNonFastforwards = true denyNonFastforwards = false 

做一件事,得到提交的SHA号。 如87c9808然后,

  1. 移动自己,这是你的头指定的提交(通过做git reset –hard 89cef43 //在此提及你的号码)
  2. 接下来在一个随机文件中进行一些更改,以便git会要求您在本地进行提交,然后进行远程提交。因此,您现在需要做的是。 应用改变之后git commit -a -m“试验提交”
  3. 现在通过git push origin master推送下面的提交(如果这已经在本地提交)
  4. 现在git会问你的是那个

错误:未能推动一些裁判' https://github.com/YOURREPOSITORY/AndroidExperiments.git '提示:更新被拒绝,因为你的当前分支的提示是后面的提示:其远程副本。 在再次推送之前集成远程更改(例如提示:'git pull …')。**

  1. 因此,现在你可以做的是

git push --force origin master

  1. 因此,我希望它的作品:)

如果你想要一个以前版本的文件,我会build议使用git checkout。

 git checkout <commit-hash> 

这样做会将您及时发回,不会影响您项目的当前状态,您可以来到主线git结帐主线

但是当你在参数中添加一个文件时,这个文件会从前一次被带回到你当前的项目时间,也就是说你当前的项目被改变了,需要被提交。

 git checkout <commit-hash> -- file_name git add . git commit -m 'file brought from previous time' git push 

这样做的好处是它不会删除历史logging,也不会恢复特定的代码更改(git revert)

点击此处查看https://www.atlassian.com/git/tutorials/undoing-changes#git-checkout