通过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
。