丢弃Git中的本地提交

时间:2011-02-23 21:33:56

标签: git

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

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

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

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


请注意,此问题专门针对提交关于:

  • 未跟踪文件
  • 非分期更改
  • 暂停但未提交的更改

20 个答案:

答案 0 :(得分:2024)

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

执行git revert使提交删除提交,以保持每个人的历史正确。

答案 1 :(得分:224)

只需删除您的本地主分支并重新创建它:

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

答案 2 :(得分:168)

尝试:

git reset --hard <the sha1 hash>

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

答案 3 :(得分:64)

删除最近的提交:

git reset --hard HEAD~1

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

git reset --soft HEAD~1

答案 4 :(得分:45)

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

enter image description here

答案 5 :(得分:31)

在你的分支尝试上:

git reset --hard origin/<branch_name>

使用&#34; git log&#34;验证反转(到状态,没有本地提交)或&#34; git status&#34;因此。

答案 6 :(得分:19)

git reset --hard @{u} *删除当前分支上的所有本地更改,包括提交。令我惊讶的是,没有人发布此消息,因为考虑到您不必查找要还原到分支或与分支一起玩的提交。

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

答案 7 :(得分:19)

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

git reset --hard origin/master

PS:Origin / master-是指向master分支的远程指针。 您可以使用任何分支名称替换master

答案 8 :(得分:12)

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

gitk --all

回滚到该提交

git reset --hard sha1_id

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

答案 9 :(得分:8)

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

答案 10 :(得分:7)

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

git rebase -i HEAD~2 - &gt;它将重新定义最后两次提交

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

答案 11 :(得分:3)

使用任意次数,以恢复到上一次提交,而不会删除您最近创建的任何文件。

git reset --soft HEAD~1

然后使用

git reset HEAD <name-of-file/files*>

取消登台或取消跟踪。

答案 12 :(得分:2)

对于那些对Visual Studio解决方案感兴趣的人,这里是练习:

  1. Team Explorer窗口中,连接到目标存储库。
  2. 然后从Branches中,右键单击所需分支,然后选择View history
  3. History窗口中右键单击提交,然后选择Reset -> Delete changes (--hard)

那将丢弃您的本地提交,并将您的回购状态重置为选定的提交。即撤回仓库后所做的更改将丢失。

答案 13 :(得分:2)

在回答之前,让我们添加一些背景知识,解释这是什么HEAD。因为下面的某些选项会导致头部脱离

First of all what is HEAD?

HEAD只是对当前分支上当前提交(最新)的引用。
在任何给定时间只能有一个HEAD。 (不包括git worktree

HEAD的内容存储在.git/HEAD内部,并且包含当前提交的40个字节的SHA-1。


detached HEAD

如果您不在最近的提交上,则意味着HEAD指向历史上的先前提交,称为 detached HEAD 。< / p>

enter image description here

在命令行上,它看起来像这样-SHA-1而不是分支名称,因为HEAD没有指向当前分支的尖端

enter image description here

enter image description here

关于如何从分离的HEAD中恢复的几种选择:


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

这将签出指向所需提交的新分支。
该命令将签出给定的提交。
此时,您可以创建一个分支并从此开始工作。

# Checkout a given commit. 
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# create a new branch forked to the given commit
git checkout -b <branch name>

git reflog

您也可以随时使用reflog
git reflog将显示更新HEAD的所有更改,并且签出所需的reflog条目会将HEAD设置为此提交。

每次修改HEAD时,reflog

git reflog
git checkout HEAD@{...}

这将使您回到所需的提交

enter image description here


git reset --hard <commit_id>

“将” HEAD“移动”回所需的提交。

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts if you've modified things which were
# changed since the commit you reset to.
  • 注意:(Since Git 2.7
    您也可以使用git rebase --no-autostash

git revert <sha-1>

“撤消”给定的提交或提交范围。
reset命令将“撤消”在给定提交中所做的任何更改。
带有撤消补丁的新提交将被提交,而原始提交也将保留在历史记录中。

# add new commit with the undo of the original one.
# the <sha-1> can be any commit(s) or commit range
git revert <sha-1>

此架构说明了哪个命令可以执行什么操作。
如您所见,reset && checkout修改了HEAD

enter image description here

答案 14 :(得分:2)

如果您只想丢弃本地提交并将修改保留在文件中,请执行
git reset @〜
其他答案解决了硬重置

答案 15 :(得分:1)

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

git clean -df

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

git reset --hard origin/<branch_name>

答案 16 :(得分:1)

为要还原的提交找到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

答案 17 :(得分:0)

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

您可以发出:

git reset --hard HEAD~5

它应该删除最近5次提交。

答案 18 :(得分:0)

如果您将本地存储库弄得一团糟,那么丢弃Git中本地提交的一种可靠方法是...

  1. 使用“ git config --get remote.origin.url”获取远程来源的URL
  2. 将本地git文件夹重命名为“ my_broken_local_repo”
  3. 使用“ git clone ”获取远程git存储库的新本地副本

以我的经验,Eclipse很好地处理了周围的环境变化。但是,您可能需要在Eclipse中选择受影响的项目并清理它们以强制Eclipse重新构建它们。我想其他IDE也可能需要强制重建。

上述过程的一个附带好处是,您将发现您的项目是否依赖于未放入git的本地文件。如果发现丢失的文件,则可以从“ my_broken_local_repo”中复制它们并将其添加到git中。一旦确定新的本地存储库已具备所需的一切,就可以删除“ my_broken_local_repo”。

答案 19 :(得分:0)

git reset --hard <SHA-Code>

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

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

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

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

您的分支机构的日期为Origin/<Branch Name>