丢弃Git中的本地提交

Dav*_*les 1304 git

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

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

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

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


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

  • 未跟踪的文件
  • 未分期的变化
  • 上演但未提交的变更

Ben*_*son 2258

如果您的超额提交仅对您可见,您可以git reset --hard origin/<branch_name>回到原点所在的位置.

做一个git revert使得提交删除的,保持每个人的历史理智的方式提交.

  • `git reset --hard <commit hash,branch或tag>`如果你想转到远程分支以外的特定引用. (86认同)
  • 需要明确的是,如果你不是在使用`master`而是在另一个分支上,你应该运行`git reset --hard origin/<your-branch-name>` (49认同)
  • 这不仅会丢弃本地提交,还会丢弃工作树中的所有内容(即本地文件).如果您想要做的只是取消承诺,但保持您的工作原封不动,您应该按照http://stackoverflow.com/questions/2845731/how-to-uncommit-my-last-进行"git reset HEAD ^"...提交功能于混帐 (26认同)
  • 您可能希望在此之后执行 Fetch。这修复了 SourceTree 上提交等待推送计数器的数量。 (5认同)
  • `git reset --hard origin/&lt;branch_name&gt;` 它也会重置项目配置,所以要注意这一点。我有一个很大的 `.cfg` 文件,它被重置为默认值。我不得不再次花上几个小时。 (5认同)
  • 请更新您的答案,以表明这实际上会删除您所做的所有工作(就像 @aaronbauman 在 2016 年提到的那样)。当我只想撤消上次提交而不使用“恢复”时,我失去了很多工作,以便我可以在推送之前取出敏感值。 (3认同)

Ram*_* B. 243

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

git branch -D master
git checkout origin/master -b master
Run Code Online (Sandbox Code Playgroud)

  • 这不是删除单个本地提交的好方法。最好使用`git reset --hard origin/&lt;branch_name&gt;` (7认同)
  • 当回溯您的更改会花费太多时间时,这很有效,这在我进行了几次 rebase 后发生了。 (3认同)

And*_*rin 187

尝试:

git reset --hard <the sha1 hash>
Run Code Online (Sandbox Code Playgroud)

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

  • 赞成这个b/c它是有用的信息,但是本杰克逊的回答得到了完全解决我想要的标记 - 以一种不需要我查找提交哈希的方式.:) (5认同)
  • 这是您的新分支尚未推送到原点时的分支 (2认同)

Jam*_* L. 101

删除最近的提交:

git reset --hard HEAD~1

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

git reset --soft HEAD~1

  • 有用的答案.谢谢!我用git reset --soft origin/master (5认同)
  • 在 Windows 中 `--hard "HEAD@{1}"` (3认同)
  • @TarunKumar谢谢!我正在使用VS集成,而您的解决方案是我能够清除一堆我不希望在没有权限签入的分支中不需要的合并提交的唯一方法。 (2认同)
  • 谢谢,正是我正在寻找的,“git reset --soft HEAD~1”完成了我无意中提交的工作并想要恢复,但有其他文件我不想在恢复后被破坏。 (2认同)

Mar*_*avi 51

长话短说

在你的分支机构

git reset --hard HEAD^将丢弃最后一次1本地提交

git reset --hard HEAD~n将丢弃最后的n本地提交


mur*_*uge 46

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

在此输入图像描述


Lah*_*cen 44

您可以使用这个 git 命令

git reset --hard origin/<branch_name>
Run Code Online (Sandbox Code Playgroud)

  • 正是我一直在寻找的东西。我省略了“/&lt;branch_name&gt;”,因为我想要重置的分支是我当前的分支。 (4认同)

par*_*ish 36

在您的分支尝试:

git reset --hard origin/<branch_name>
Run Code Online (Sandbox Code Playgroud)

使用" git log"或" git status"因此验证反转(到状态,没有本地提交).

  • 你的答案对这个质量保证没有任何新意 (6认同)
  • 接受的答案与你的相同,减去通用的分支名称,并在评论中@Zoltan明确地说:"只是要清楚,如果你不是在掌握但在另一个分支上工作,你应该运行git reset --hard产地/ <您的分支名称>` (3认同)
  • 这是我认为最好的答案。 (2认同)

小智 30

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

git reset --hard origin/master
Run Code Online (Sandbox Code Playgroud)

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


小智 21

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

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

  • 像fish 这样的一些shell 会解释“@”,所以你可能需要把'@{u}' 放在引号中,例如`git reset --hard '@{u}'。总之,好找! (2认同)
  • 如何打印@{u}的值? (2认同)

Cod*_*ard 16

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

First of all what is HEAD?

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

的内容HEAD存储在里面.git/HEAD,它包含当前提交的 40 字节 SHA-1。


detached HEAD

如果您不在最新的提交上——这意味着它HEAD指向历史中的先前提交,它被称为detached HEAD.

在此处输入图片说明

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

在此处输入图片说明

在此处输入图片说明

关于如何从分离的 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
Run Code Online (Sandbox Code Playgroud)

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

# 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>
Run Code Online (Sandbox Code Playgroud)

git reflog

您也可以随时使用reflog
git reflog将显示更新HEAD并检出所需的引用日志条目的任何更改将设置HEAD回此提交。

每次修改 HEAD 时都会有一个新条目 reflog

git reflog
git checkout HEAD@{...}
Run Code Online (Sandbox Code Playgroud)

这会让你回到你想要的提交

在此处输入图片说明


git reset --hard <commit_id>

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

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back
Run Code Online (Sandbox Code Playgroud)

git revert <sha-1>

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

# 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>
Run Code Online (Sandbox Code Playgroud)

这个模式说明了哪个命令做什么。
如您所见,reset && checkout修改HEAD.

在此处输入图片说明


Jim*_*123 14

使用任意次数,在不删除您最近创建的任何文件的情况下恢复到上次提交。

git reset --soft HEAD~1
Run Code Online (Sandbox Code Playgroud)

然后使用

git reset HEAD <name-of-file/files*>
Run Code Online (Sandbox Code Playgroud)

取消暂存或取消跟踪。


Nic*_*las 12

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

gitk --all
Run Code Online (Sandbox Code Playgroud)

回滚到该提交

git reset --hard sha1_id
Run Code Online (Sandbox Code Playgroud)

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


小智 12

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

您可以发出:

git reset --hard HEAD~5
Run Code Online (Sandbox Code Playgroud)

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


Rob*_*ert 9

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

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

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


Nik*_*tre 8

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


Ela*_*ode 8

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

git clean -df
Run Code Online (Sandbox Code Playgroud)

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

git reset --hard origin/<branch_name>
Run Code Online (Sandbox Code Playgroud)


Boz*_*eff 5

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

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

这将丢弃您的本地提交并将您的存储库状态重置为选定的提交。即您在拉取 repo 后所做的更改将丢失。


Ash*_*ker 5

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


zee*_*zee 5

找到您想要恢复到的提交的 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
Run Code Online (Sandbox Code Playgroud)

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

za$ git reset --mixed cf42fa2
Run Code Online (Sandbox Code Playgroud)

可用标志:

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
Run Code Online (Sandbox Code Playgroud)