题 扔掉git中的本地提交


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

显然,删除我的工作目录和重新克隆会做到这一点,但再次从github下载所有内容似乎有点矫枉过正,并没有很好地利用我的时间。

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

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


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

  • 未跟踪的文件
  • 未分期的变化
  • 分阶段但未提交的更改

930
2018-02-23 21:33


起源


可能重复 各种方法删除本地Git更改 - spiderman


答案:


如果您的超额提交仅对您可见,您可以这样做 git reset --hard origin/<branch_name> 回到起源的地方。

做一个 git revert 品牌  承诺删除  以一种让每个人的历史都保持清醒的方式提交。


1627
2018-02-23 21:38



哇真棒一个git重置 - 硬起源/大师这正是我正在寻找的。我不想承诺掌握任何东西,而这正是如此。谢谢。 - pal4life
git reset --hard <commit hash, branch, or tag> 如果要转到远程分支以外的特定引用。 - Sam Soffes
要明确一点,如果你不工作的话 master 但在另一个分支上,你应该跑 git reset --hard origin/<your-branch-name> - Zoltán
这不仅会丢弃本地提交,还会丢弃工作树中的所有内容(即本地文件)。如果您想要做的只是取消承诺,但保持您的工作完好无损,那么您应该执行“git reset HEAD ^”... stackoverflow.com/questions/2845731/... - aaronbauman
这不起作用,不得不删除本地git存储库并再次克隆它。 - Lankymart


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

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

194
2018-02-23 21:38



当回溯您的更改会花费太多时间时,这很有效,这在经历了几次重组之后发生在我身上。 - aross
对于团队成员之间的子树拉/推问题很有用! - Jorge Orpinel
当您想要恢复分支而不仅仅是主分支时,这是完美的。 - Vladimir Ralev
当你的远程分支很大时,这个解决方案是个问题!!!! - Gabox
在eclipse中使用egit,这个解决方案非常完美且简单! - Cyborgz


尝试:

git reset --hard <the sha1 hash>

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


141
2018-02-23 21:37



上调了这个b / c它是有用的信息,但是Ben Jackson的答案得到了完全解决我想要的标记 - 以一种不需要我查找提交哈希的方式。 :) - David Moles


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

enter image description here


41
2018-01-29 20:54





在您的分支尝试:

git reset --hard origin/<branch_name>

使用“验证反转(到状态,没有本地提交)”git log“ 要么 ”git status“因此。


27
2018-03-31 15:17



你的答案对这个质量保证没有任何新意 - Troyseph
@Troyseph:上面列出的所有答案,我都是按原样尝试,并没有修复方案。通用方法在上面的任何一个答案中没有说明,这是本文试图回答的问题。 - parasrish
接受的答案与您的答案相同,减去通用分支名称,并在@Zoltan明确指出的评论中 Just to be clear, if you're not working on master but on another branch, you should run git reset --hard origin/<your-branch-name> - Troyseph


删除最近的提交:

git reset --hard HEAD~1

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

git reset --soft HEAD~1


15
2018-02-11 14:06



有用的答案。谢谢!我用git reset --soft origin / master - Tarun Kumar


要查看/获取您想要返回的提交的sha1 id

gitk --all

回滚到该提交

git reset --hard sha1_id

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


11
2018-05-27 10:07



这对于远程不再可用的情况很有用,而且只需要重置为某个本地提交。 gitk太棒了 - 事先并没有意识到这一点。 - theRiley
如果您已经使用gitk,您也可以只需右键单击提交并选择“将分支XY重置为此处”。 - mkrieger1
并且不会立即删除较新的提交。没有分支指向它们了(记住,分支只不过是特定提交的“书签”)。 - mkrieger1


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


7
2017-10-17 21:43



我知道这可能不是最短的解决方案,但自从恕我直言以来,我对你赞不绝口 git rebase -i 是一种解决许多类似问题的更通用的方法,可以在各种情况下提供帮助。 - Stefan Marinov


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

git rebase -i HEAD~2  - >它将重新定义最后2次提交

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


5
2017-09-26 09:57