丢弃Git中的本地提交

问题描述 投票:1142回答:12

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

显然,删除我的工作目录并重新克隆会这样做,但是再次从GitHub下载所有内容似乎有些过分,而且不能很好地利用我的时间。

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

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


请注意,这个问题具体是关于提交,而不是关于:

  • 未跟踪的文件
  • 未分期的变化
  • 上演但未提交的变更
git
12个回答
1977
投票

如果您的超额提交仅对您可见,您可以将git reset --hard origin/<branch_name>移回原点所在的位置。这会将存储库的状态重置为先前的提交,并将丢弃所有本地更改。

做一个git revert做了一个新的提交,以一种让每个人的历史保持清醒的方式删除旧的提交。


7
投票

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

git rebase -i HEAD~2 - >它会改变最后两次提交

我使用'drop'作为我想删除的提交签名。


1
投票

删除未跟踪的文件(未提交的本地更改)

git clean -df

永久删除所有本地提交并获取最新的远程提交

git reset --hard origin/<branch_name>

0
投票
git reset --hard <SHA-Code>

如果您在本地副本上犯了一些错误,以确保不会错误地将其推送到远程分支,这将派上用场。

可以通过查看git仪表板的webVersion获取分支上的最后一次提交来获取SHA代码。

这样,您就可以与分支上的最后一次提交同步。

成功完成硬重置后,您可以执行git pull以确认没有新的同步,即您可以看到该消息。

你的分支机构是最新的Origin/<Branch Name>


220
投票

只需删除您的本地主分支并重新创建它,如下所示:

git branch -D master
git checkout origin/master -b master

163
投票

尝试:

git reset --hard <the sha1 hash>

将头重置到你想要的任何地方。使用gitk查看您想要的提交。你也可以在gitk中重置。


59
投票

删除最近的提交:

git reset --hard HEAD~1

删除最近的提交,而不会破坏您已完成的工作:

git reset --soft HEAD~1


43
投票

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


30
投票

在您的分支尝试:

git reset --hard origin/<branch_name>

使用“git log”或“git status”验证逆转(到状态,没有本地提交)。


18
投票

git reset --hard @{u} *删除当前分支上的所有本地更改,包括提交。我很惊讶没有人发布这个,但考虑到你不必查找承诺恢复或使用分支机构。

*也就是说,重置到@{upstream}-common origin/<branchname>的当前分支,但并非总是如此


12
投票

要查看/获取您想要返回的提交的SHA-1 ID

gitk --all

回滚到该提交

git reset --hard sha1_id

!注意。在该提交之后进行的所有提交都将被删除(以及对项目的所有修改)。因此,首先要将项目克隆到另一个分支或复制到另一个目录。


8
投票

对于未被推送的本地提交,您还可以使用git rebase -i删除或压缩提交。