在Git中丢弃本地提交

2319
由于某些不良的挑选,我的本地 Git 存储库目前领先于 origin 五个提交,并且状态不佳。我想要摆脱所有这些提交并重新开始。
显然,删除我的工作目录并重新克隆会解决问题,但从 GitHub 再次下载所有内容似乎过度了,也不是很省时间。
也许 git revert 是我需要的,但即使它能将代码本身恢复到正确的状态,我也不想最终领先于 origin 十个提交(甚至是六个)。我只想假装过去的半个小时从未发生过。
有没有一个简单的命令可以做到这一点?这似乎是一个很明显的用例,但我找不到任何实例。
注意,这个问题特别涉及到提交,而不是:未跟踪的文件、未暂存的更改或已暂存但未提交的更改。

3
可能是如何删除本地 Git 更改的各种方法的重复问题。 - spiderman
26个回答

3711
如果您的多余提交只对您可见,您可以执行以下操作:git reset --hard origin/<branch_name>,以回到原点。这将重置仓库状态为上一个提交状态,并且会舍弃所有本地更改。
使用git revert可以创建新的提交来移除旧的提交,以使每个人的历史记录都保持完整。

145
如果您想要回到特定的引用而不是远程分支,可以使用命令 git reset --hard <commit hash, branch, or tag> - Sam Soffes
91
这不仅会丢弃本地提交,而且会扔掉工作树中的所有内容(即您的本地文件)。如果您想要的只是取消提交但保留您的工作内容不变,您应该执行"git reset HEAD^" ... 参见 https://dev59.com/X3E85IYBdhLWcg3wSxkv - aaronbauman
7
这之后你可能需要进行一次拉取操作(Fetch)。这将解决SourceTree中待推送的提交数量计数器的问题。 - Stan
5
"git reset --hard origin/<branch_name>"会重置项目配置,因此要小心处理。我有一个很大的.cfg文件,被重置为默认值了。我又不得不花费好几个小时来重新配置它。 - Ram
3
请更新您的回答,包括这将实际删除您所做的所有工作(就像@aaronbauman在2016年提到的那样)。当我只想撤消我的最后一次提交而不使用“还原”时,我刚刚丢失了很多工作,以便在推送之前可以取出敏感值。 - SeriousLee
显示剩余5条评论

587

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

git reset --soft HEAD~1

删除最近的提交并丢弃更改:

git reset --hard HEAD~1


17
有用的答案。谢谢! 我使用了git reset --soft origin/master。 - Tarun Kumar
4
@TarunKumar 谢谢!我正在使用VS集成,你的解决方案是我唯一能够清除一堆我不想在一个我没有权限检入的分支中合并提交的方法。 - DVK
2
谢谢,这正是我想要的。"git reset --soft HEAD~1" 命令可以撤销我的提交,而且不会破坏其他我不想被撤销的文件。 - Mate Ajdukovic
2
在Windows中,--hard "HEAD@{1}" - O-9
1
在上面的答案中,将--soft答案放在第一位可能会帮助一些过于热衷于StackExchange的人浏览...没有损失,也没有知识得到。 - charo
显示剩余3条评论

397

只需删除本地主分支并重新创建即可:

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

4
在回溯更改所需时间过多时,这个方法非常有效。在我进行了几次代码重置后,情况就是这样。 - aross
1
对于团队成员之间的子树拉取/推送问题非常有用! - Jorge Orpinel Pérez
17
删除单个本地提交记录的方法不够好。更好的做法是使用 git reset --hard origin/<分支名> - Kirit Vaghela
1
也许那个解决方案可以起作用,但这并不意味着它是正确的。 - Adly
1
谢谢。对我有用。我必须检出另一个分支才能删除主分支。 - Emil Mocan
显示剩余4条评论

264

尝试:

git reset --hard <the sha1 hash>

将你的代码库重置到任何你想要的版本。使用gitk查看你想要的提交版本,然后你也可以在gitk中进行重置。


9
我点赞了这个回答,因为它提供了有用的信息。但是本·杰克逊的回答解决了我想要解决的问题,并且不需要我去查找提交哈希值,所以他的回答得到了勾选标记。 - David Moles
2
这是当你的新分支还没有被推送到远程仓库的情况。 - Jan

83

在你的分支尝试中:

git reset --hard origin/<branch_name>

使用 "git log" 或 "git status" 来验证还原状态(无本地提交)。


1
@Troyseph:我尝试了以上列出的所有答案,但并没有解决问题。这里所尝试回答的是一种通用方法,这种方法在以上任何答案中都没有被阐明。 - parasrish
3
被接受的答案与你的相同,只是去掉了通用的分支名称,在评论中@Zoltan明确表示:为了清楚起见,如果你不是在主分支上工作而是在其他分支上,请运行git reset --hard origin/<你的分支名称> - Troyseph
3
在我看来,这是最好的答案。 - dwjohnston
是的,这就是它! - Igor Vuković

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

52

简单的解决方案是将本地主分支HEAD与origin/master分支HEAD匹配

git reset --hard origin/master

提示:origin/master - 是指远程主分支的指针。 您可以将“master”替换为任何分支名称。


47

简述

在你的分支上

git reset --hard HEAD^会丢弃最近的1个本地提交

git reset --hard HEAD~n会丢弃最近的n个本地提交


40

您可以使用此git命令

git reset --hard origin/<branch_name>

3
正是我在寻找的内容。由于我要重置的分支是当前分支,因此我省略了“/<branch_name>”。 - Craig Wilcox

34

git reset --hard @{u}* 命令将删除当前分支上的所有本地更改,包括提交。我很惊讶还没有人发布这个命令,因为你不需要查找要还原到哪个提交或者操作分支

* 也就是说,重置到 @{upstream} 所在的当前分支 - 通常是 origin/<branchname>,但不总是。


2
有些像 fish 这样的 shell 会解释 "@",所以你可能需要将 '@{u}' 用引号括起来,例如 git reset --hard '@{u}'。不管怎样,发现得好! - trysis
真棒的答案真是太棒了。 - Marko
2
你如何打印@{u}的值? - Philip Rego
如果您不确定当前分支如何为推送进行配置,那么 git name-rev @{u} 就可以做到。或者,更彻底地检查该分支的配置,可以使用 git config -l | grep branch.$(git name-rev --name-only HEAD) - Romain Valeri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接