通过1提交回滚本地和远程git存储库

我已经阅读了关于这个主题的类似post,并且不能为我的生活弄清楚如何正确地做到这一点。

我检查了大约1000个我不想要的文件,我宁愿不必经过1by1,把它们全部从回购中删除。

  • 我有一个远程master分支。
  • 我有当地的master科。

他们都在同一修订。

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

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

我遇到问题。
我正在使用Git Tower,但对命令行感到舒服。 任何帮助?

更新:下面的评论很好。 使用重置似乎是部分阻碍,特别是如果存储库与其他用户共享。 如果不使用硬重置,撤消上一次提交更改的最佳方法是什么 ? 有没有办法?

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

 git reset --hard HEAD^ git push -f 

(或者,如果你有直接访问远程仓库,你可以改变它的HEAD参考,即使它是一个裸仓库 )

请注意,正如下面评论中的外星人技术在Windows(CMD会话)中所评论的那样 ,您需要^^

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

如果有人已经拉回购? 那我该怎么办?

那么我会build议一些不重写历史的东西:

  • git revert本地git revert你最后一次提交(创build一个新的提交,以反转之前的提交)
  • 推回由git revert产生的'恢复'。

设置本地分支一个修订( HEAD^表示一个修订版本):

 git reset --hard HEAD^ 

将更改推送到原点:

 git push --force 

你将不得不强制推动,因为否则git会通过一次提交来识别你是否在origin后面,没有什么会改变。

--force做的话--force git覆盖远程仓库中的HEAD ,而不考虑那里的任何进展。

如果你想恢复上次提交侦听:

步骤1:

用消息检查你的本地提交

 $ git log 

第2步:

删除上次提交而不重置本地分支(或主分支)的更改

 $ git reset HEAD^ 

或者如果你不想上次提交文件和更新监听

 $ git reset HEAD^ --hard 

第3步:

我们可以更新文件和代码,并再次需要推动它将删除以前的提交。 它会保持新的提交。

 $ git push origin branch -f 

而已!

通过input下面的命令,你可以看到你的git提交历史logging –

$ git log

假设您在特定分支上的历史logging类似于 – commit_A,commit_B,commit_C,commit_D。 其中,commit_D是最后一次提交,这是HEAD依然存在的地方。 现在,要从本地和远程删除最后一次提交,您需要执行以下操作:

第1步:删除最后一次提交 –

$ git reset –hard HEAD〜

这会将您的提交HEAD更改为commit_C

步骤2:将新的HEAD提交更改为远程

$ git push origin + HEAD

这个命令将删除最后一次从远程提交。

PS这个命令在Mac OSX上testing过,并且也可以在其他操作系统上运行(不要求其他操作系统)

对于Windows机器,请使用:

 git reset HEAD~1 #Remove Commit Locally 

如果您可以直接访问远程仓库,则可以始终使用:

 git reset --soft HEAD^ 

这是有效的,因为没有试图修改不存在的工作目录。 有关更多详细信息,请参阅原始答案:

我怎样才能取消提交git仓库中的最后一个提交?

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

 git reset --hard HEAD^ git push -f <remote> <local branch>:<remote branch> 

我只想从远程删除最后的提交,并清除提交历史logging。 以下工作就像一个魅力

 git reset --hard HEAD^ git push -f 

重置头部并恢复到以前的提交的方式是通过

 $ git reset HEAD^ --hard $ git push <branchname> -f 

但有时它可能不被远程分支接受:

 To ssh:<git repo> ! [rejected] develop -> develop (non-fast-forward) error: failed to push some refs to 'ssh:<git repo>' hint: Updates were rejected because the tip of your current branch is behind hint: its remote counterpart. Integrate the remote changes (eg hint: 'git pull ...') before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details. 

那么另一个办法是

 git revert HEAD git push <remote branch> 

这工作正常。

注意:请记住,如果git push -f <force>失败,然后尝试恢复。 做一个git pull之前,以便远程和本地同步,然后尝试git revert
使用git log来检查,以确保远程和本地在同一个提交点上具有相同的SHA1 ..

 git revert A --> B --> C -->D A--> B --> C --> D --> ^D(taking out the changes and committing reverted diffs) 

在当地的主人

 git reflog -- this will list all last commit eg 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 

没有必要担心,如果其他人拉或不。

完成!

如果你想删除n个最后的提交,有一个简单的方法来做到这一点:

 git reset --hard HEAD~n // where n is the number of commits 

您可以更改要删除的任何数量的最后提交的n

为了把这个改变推到远程,你需要用force-f )参数做一个git push

 git push -f <remote_repo> <remote_branch> 

不过,如果在提交后想要删除远程(Github)上的新提交, 则不build议使用-f--hard选项执行任何git命令。 在这种情况下,总是使用git revert