由于一些糟糕的选择,我的本地Git存储库目前比原始库提前了五次提交,并且状态不佳。我想摆脱所有这些承诺,重新开始。

很明显,删除我的工作目录并重新克隆就可以了,但再次从GitHub下载所有内容似乎太过了,而且没有很好地利用我的时间。

也许git-restore是我需要的,但我不想在源代码之前提交10次(甚至6次),即使它确实将代码本身恢复到正确的状态。我只想假装最后半小时从未发生过。

有一个简单的命令可以做到这一点吗?这似乎是一个明显的用例,但我找不到任何例子。


请注意,这个问题专门针对提交,而不是:

未跟踪的文件未分级更改已分段但未提交的更改


当前回答

$ git fetch origin
$ git reset --hard origin/master

这将下载最新版本的远程分支,并用它覆盖本地分支,从而有效地丢弃所有本地提交。如有必要,用适当的远程分支名称替换原始/主分支。

其他回答

我有一种情况,我想删除一个未被推送的提交,但该提交在另一个提交之前。为此,我使用了以下命令

git rebase-i HEAD~2->它将对最后两次提交进行重新基化

我使用“drop”作为我想要删除的提交签名。

查找要还原到的提交的sha1:

za$ git reflog
... snip ...
cf42fa2... HEAD@{0}: commit: fixed misc bugs
~
~
cf42fa2... HEAD@{84}: commit: fixed params for .....
73b9363... HEAD@{85}: commit: Don't symlink to themes on deployment.
547cc1b... HEAD@{86}: commit: Deploy to effectif.com web server.
1dc3298... HEAD@{87}: commit: Updated the theme.
18c3f51... HEAD@{88}: commit: Verify with Google webmaster tools.
26fbb9c... HEAD@{89}: checkout: moving to effectif

然后使用--mixed标志,以便“重置HEAD和索引”:

za$ git reset --mixed cf42fa2

可用标志:

za$ git reset -h

-q, --quiet           be quiet, only report errors
--mixed               reset HEAD and index
--soft                reset only HEAD
--hard                reset HEAD, index and working tree
--merge               reset HEAD, index and working tree
--keep                reset HEAD but keep local changes
--recurse-submodules[=<reset>]
                      control recursive updating of submodules
-p, --patch           select hunks interactively
-N, --intent-to-add

如果您使用的是Atlassian SourceTree应用程序,可以使用上下文菜单中的重置选项。

$ git fetch origin
$ git reset --hard origin/master

这将下载最新版本的远程分支,并用它覆盖本地分支,从而有效地丢弃所有本地提交。如有必要,用适当的远程分支名称替换原始/主分支。

如果您的分支比“origin/XXX”领先5次提交。

您可以发布:

git reset --hard HEAD~5

它应该删除最后5个提交。