我读过关于这个主题的类似帖子,但我不知道如何正确地做到这一点。

我签入了大约1000个我不想要的文件,我宁愿不需要逐个检查并将它们全部从回购中删除。

我有一个远程主分支。 我有本地主分支。

他们都在同一个修订。

我想回滚我的远程1提交。

我的历史是A- B- C- D- E。 我想回滚我的本地到D。 然后把它推到远程,所以我的当前哈希将是D远程和本地。

我做这个有问题。 我正在使用Git Tower,但对命令行很熟悉。任何帮助吗?

更新: 下面的评论很棒。使用重置似乎在一定程度上是不鼓励的,特别是当存储库与其他用户共享时。 在不使用硬重置的情况下撤销之前提交的更改的最佳方法是什么?有办法吗?


当前回答

对我来说有两个命令:

git checkout commit_id
git push origin +name_of_branch

其他回答

如果你只想在不破坏本地存储库的情况下从远程存储库中删除最后一次提交,这里有一行代码:

git push origin +origin/master~:master

使用以下语法:

git push <remote> <refspec>

这里,<remote>是origin, <refspec>有以下结构:

+origin/master~:master

详见git-push(1)。前面的+表示“force push this ref”,另一部分表示“from origin/master~ to master (from remote origin)”。不难知道origin/master~是origin/master之前的最后一次提交,对吗?

对于Windows机器,使用:

git reset HEAD~1  #Remove Commit Locally

如果还没有人拉你的远程回购,你可以改变你的分支HEAD,并强制将其推到远程回购:

git reset --hard HEAD^ 
git push -f 

(或者,如果你可以直接访问远程回购,你可以改变它的HEAD引用,即使它是一个裸回购)

注意,正如alien-technology在下面的评论中所评论的,在Windows (CMD会话)上,你需要^^:

git reset --hard HEAD^^
git push -f 

然后呢?正如Jon Schneider的评论所指出的:

如果带有“HEAD^”的命令导致错误,没有找到匹配:HEAD^,请参阅“git show HEAD^似乎没有工作。”这正常吗?”

自2011年更新: 使用git push——force-with-lease(我在这里介绍的是2013年git 1.8.5引入的)更安全。

参见Schwern的回答。


如果已经有人收回了呢?那我该怎么办?

那我建议一些不会改写历史的事情:

Git在本地恢复你的最后一次提交(创建一个新的提交来反转前一次提交所做的) Push由git revert生成的'revert'。

对我来说有两个命令:

git checkout commit_id
git push origin +name_of_branch

在本地主机上

git reflog
-- this will list all last commit
  e.g Head@{0} -- wrong push
      Head@{1} -- correct push  
git checkout Head@{1} .
  -- this will reset your last modified files

git status 
git commit -m "reverted to last best"
git push origin/master

没必要担心别人拉不拉。

完成了!