git log
commit 101: bad commit # latest commit, this would be called 'HEAD'
commit 100: good commit # second to last commit, this is the one we want
要将所有内容恢复到上次提交之前的方式,我们需要 reset 到 HEAD 之前的提交:
git reset --soft HEAD^ # use --soft if you want to keep your changes
git reset --hard HEAD^ # use --hard if you don't care about keeping the changes you made
git commit -m 'restoring the file I removed by accident'
git log
commit 102: restoring the file I removed by accident
commit 101: removing a file we don't need
commit 100: adding a file that we need
prompt> git reset --hard 5a7404742c85
HEAD is now at 5a74047 Added one more page to catalogue
prompt> git push origin master --force
Total 0 (delta 0), reused 0 (delta 0)
remote: bb/acl: neoneye is allowed. accepted payload.
To [email protected]:thecompany/prometheus.git
+ 09a6480...5a74047 master -> master (forced update)
prompt>
查看 git help reset ,特别是有关 --soft--mixed 和 --hard 的部分,以便更好地了解它的作用 .
Reflog
如果你陷入困境,你总是可以使用reflog来查找丢弃的提交:
$ git reset @~
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~
2c52489 HEAD@{1}: commit: added some .class files
$ git reset 2c52489
... and you're back where you started
git push --delete (branch_name) ## remove public version of branch
在当地清理您的分支,然后重新抢购......
git push origin (branch_name)
在正常情况下,您可能不需要't worry about your private-branch commit history being pristine. Just push a followup commit (see '如何撤消上面的公共提交,稍后,执行squash-merge来隐藏历史记录 .
git reset --soft HEAD^ # Use --soft if you want to keep your changes.
git reset --hard HEAD^ # Use --hard if you don't care about keeping your changes.
30 回答
“将工作树重置为上次提交”
“从工作树中清除未知文件”
见 - Git Quick Reference
NOTE: 此命令将删除您之前的提交,因此请谨慎使用!
git reset --hard
更安全 -单个命令:
它可以很好地撤消上一次本地提交!
在我的情况下,我不小心提交了一些我不想要的文件 . 所以我做了以下工作:
使用gitk或git log --stat验证结果
对于本地提交
或者如果你不记得它究竟在哪个提交中,你可以使用
对于推送提交
从存储库历史记录中删除文件的正确方法是使用
git filter-branch
. 那是,但我建议您小心使用此命令 . 阅读更多git-filter-branch(1) Manual Page .
要么
Warning: The above command will permanently remove the modifications to the .java files (and any other files) that you wanted to commit.
hard reset
到HEAD-1
会在您错误提交之前将您的工作副本设置为提交状态 .有很多方法可以做到:
Git命令撤消上次提交/先前提交:
Warning: 如果你不知道自己在做什么,请不要使用--hard . - 硬也是 dangerous ,它可能 delete your files.
Basic command to revert the commit in Git is:
要么
COMMIT-ID :提交的ID
n: 是您要还原的最后提交数
您可以获得提交ID,如下所示:
其中 d81d3f1 和 be20eb8 是提交ID .
Now let's see some cases:
假设您要还原最后一次提交'd81d3f1' . 这有两个选择:
要么
假设您要还原提交'be20eb8':
有关更多详细信息,您可以参考并尝试其他一些命令,以便将头重置为指定状态:
使用reflog查找正确的状态
重置前的REFLOG
选择正确的reflog(在我的例子中为f3cb6e2)并输入
之后,repo HEAD将重置为HEADid

LOGET RESET
最后,reflog如下图所示
REFLOG FINAL
添加/删除文件以获得您想要的方式:
然后修改提交:
之前的错误提交将被编辑以反映新的索引状态 - 换句话说,它就像你从来没有犯过错误 .
请注意,只有在尚未推送的情况下才应执行此操作 . 如果你已推,那么你只需要正常提交修复 .
如果您计划完全撤消本地提交,无论您在提交时做了什么更改,如果您对此没有任何担心,只需执行以下命令即可 .
(此命令将忽略您的整个提交,您的更改将完全从本地工作树中丢失) . 如果要撤消提交,但希望在暂存区域中进行更改(在提交之前,就像在
git add
之后),请执行以下命令 .现在,您提交的文件将进入暂存区域 . 假设您想要更新文件,因为您需要编辑一些错误的内容,请执行以下命令
现在提交的文件从分段区域进入未分区区域 . 现在文件已经可以编辑了,所以无论你做什么改变,你都要编辑并添加它并进行新的/新的提交 .
More
如果你不知道如何工作,撤销提交有点可怕 . 但是如果你理解的话,这实际上非常容易 .
假设你有这个,其中C是你的HEAD,(F)是你文件的状态 .
你想 nuke commit C and never see it again . 你做这个:
结果是:
现在B是HEAD . 因为您使用了
--hard
,所以您的文件将重置为它们在提交B时的状态 .啊,但是假设提交C不是灾难,但只是有点偏 . 在进行更好的提交之前,您希望 undo the commit but keep your changes 进行一些编辑 . 从这里开始,用C作为你的HEAD:
你可以这样做,不用
--hard
:在这种情况下,结果是:
在这两种情况下,HEAD只是指向最新提交的指针 . 当你执行
git reset HEAD~1
时,你告诉Git将HEAD指针移回一次提交 . 但是(除非你使用--hard
)你保留文件原样 . 所以现在git status
显示你已经检查过C的变化 . 你没有丢失任何东西!对于最轻的触摸,你甚至可以 undo your commit but leave your files and your index :
这不仅会使您的文件单独存在,甚至会使您的索引单独存在 . 当您执行
git status
时,您将看到索引中的文件与之前一样 . 事实上,在这个命令之后,你可以做git commit
并且你将重做你刚才所做的相同提交 .还有一件事: Suppose you destroy a commit ,如第一个例子, but then discover you needed it after all ?运气好,对吗?
不,还有办法让它回来 . 键入
git reflog
,您将看到已经移动的(部分)提交shas(即哈希)列表 . 找到您销毁的提交,并执行以下操作:你现在已经复活了这个提交 . 提交实际上并没有在Git中被摧毁大约90天,所以你通常可以回去救你并不意味着摆脱 .
How to undo the last Git commit?
要将所有内容恢复到上次提交之前的状态,我们需要在HEAD之前重置为提交 .
现在检查你的git日志 . 它将显示我们的上一次提交已被删除 .
撤消提交和重做
这是您要撤消的内容
这会使您的工作树(磁盘上文件的状态)保持不变但撤消提交并保留您未提交的更改(因此它们将在
git status
中显示为"Changes not staged for commit",并且您需要在提交之前再次添加它们) . 如果您只想对上一次提交添加更多更改,或者更改提交消息1,则可以使用git reset --soft HEAD~
,这类似于git reset HEAD~
(其中HEAD~
与HEAD~1
相同),但会暂时保留现有更改 .对工作树文件进行更正 .
git add
要包含在新提交中的任何内容 .提交更改,重用旧的提交消息 .
reset
将旧头复制到.git/ORIG_HEAD
;commit
与-c ORIG_HEAD
将打开一个编辑器,该编辑器最初包含旧提交的日志消息,并允许您编辑它 . 如果您不需要编辑消息,则可以使用-C
选项 .但请注意,如果您已对索引添加了任何新更改,则使用
commit --amend
会将它们添加到您之前的提交中 .如果代码已经推送到您的服务器并且您有权覆盖历史记录(rebase),那么:
你也可以看看这个答案:
How to move HEAD back to a previous location? (Detached head)
上面的答案将显示
git reflog
,用于找出您希望恢复的SHA-1是什么 . 一旦找到要撤消的点,就可以使用上面解释的命令序列 .1但是,请注意,如果您在提交消息中犯了错误,则无需重置为先前的提交 . 更简单的选择是
git reset
(为了更新您之后所做的任何更改),然后是git commit --amend,这将打开预先填充了最后一次提交消息的默认提交消息编辑器 .主要有两种情况
You haven't pushed the commit yet
如果问题是您提交的额外文件(并且您不希望存储库中存在这些文件),则可以使用
git rm
删除它们,然后使用--amend
进行提交您还可以使用
-r
删除整个目录,甚至可以与其他Bash命令结合使用删除文件后,您可以使用 --amend 选项进行提交
这将重写您最近的本地提交删除额外的文件,因此,这些文件永远不会在推送时发送,也将被GC从本地.git存储库中删除 .
You already pushed the commit
您可以应用其他方案的相同解决方案,然后使用
-f
选项执行git push
,但它是 not recommended ,因为它会以不同的更改覆盖远程历史记录(它可能会弄乱您的存储库) .相反,你必须在没有
--amend
的情况下进行提交(记住这个关于-amend`:该选项重写最后一次提交的历史记录) .我花了一段时间才弄明白,所以也许这会帮助别人......
根据您是否已将提交公开(推送到远程存储库),有两种方法可以“撤消”上次提交:
如何撤消本地提交
假设我在本地提交,但现在想删除该提交 .
要将所有内容恢复到上次提交之前的方式,我们需要
reset
到HEAD
之前的提交:现在
git log
将显示我们的上一次提交已被删除 .如何撤消公共提交
如果您已将提交公开,则需要创建一个新的提交,它将“还原”您在先前提交(当前HEAD)中所做的更改 .
您的更改现在将被还原并准备好您提交:
欲了解更多信息,请查看Git Basics - Undoing Things
第一次运行:
它将向您显示您在存储库中执行的所有可能操作,例如,提交,合并,拉取等 .
然后做:
如果你犯了垃圾而没有推,
要么
我想在我们的共享存储库中撤消最新的5次提交 . 我抬头一望我要回滚到的修订版ID . 然后我键入以下内容 .
如果安装了Git Extras,则可以运行
git undo
来撤消最新提交 .git undo 3
将撤消最后3次提交 .很简单,在命令行中运行:
更改上次提交
替换索引中的文件:
然后,如果它是一个私有分支, amend 提交:
或者,如果它是共享分支,则进行新的提交:
( to change a previous commit ,使用真棒interactive rebase)
ProTip™:将
*.class
添加到gitignore以再次停止此操作 .要还原提交
如果您需要更改上次提交,则修改提交是理想的解决方案,但更通用的解决方案是
reset
.您可以将git重置为任何提交:
N
是HEAD
之前的提交数量,@~
重置为上一次提交 .因此,您可以使用以下命令而不是修改提交:
查看
git help reset
,特别是有关--soft
--mixed
和--hard
的部分,以便更好地了解它的作用 .Reflog
如果你陷入困境,你总是可以使用reflog来查找丢弃的提交:
使用
git revert <commit-id>
要获取提交ID,只需使用
git log
其他方式:
检查要还原的分支,然后将本地工作副本重新设置为您希望成为远程服务器上最新版本的提交(之后的所有内容将再次出现) . 为此,在SourceTree中我右键单击并选择“将BRANCHNAME重置为此提交” .
然后导航到存储库的本地目录并运行以下命令:
这将删除本地存储库中当前提交之后的所有提交,但仅删除该一个分支 .
使用SourceTree(Git的图形工具)查看您的提交和树 . 您可以通过右键单击直接手动重置它 .
如何修复以前的本地提交
使用git-gui(或类似的)来执行
git commit --amend
. 从GUI中,您可以从提交中添加或删除单个文件 . 您还可以修改提交消息 .如何撤消先前的本地提交
只需将分支重置为上一个位置(例如,使用
gitk
或git rebase
) . 然后从保存的副本中重新应用更改 . 在本地存储库中进行垃圾收集之后,就像从未发生过意外提交一样 . 要在单个命令中执行所有操作,请使用git reset HEAD~1
.Word of warning :不小心使用
git reset
是让您的工作副本陷入混乱状态的好方法 . 我建议Git新手尽可能避免这种情况 .如何撤消公共提交
执行reverse cherry pick(git-revert)以撤消更改 .
如果您还没有将其他更改添加到您的分支,您可以简单地做...
然后将更新的分支推送到共享存储库 .
提交历史记录将分别显示两个提交 .
高级:更正公共存储库中的专用分支
这可能很危险 - 请确保您有分支的本地副本以进行重新安装 .
另请注意:如果其他人可能正在分支机构工作,您不希望这样做 .
在当地清理您的分支,然后重新抢购......
在正常情况下,您可能不需要't worry about your private-branch commit history being pristine. Just push a followup commit (see '如何撤消上面的公共提交,稍后,执行squash-merge来隐藏历史记录 .
输入
git log
并找到最后一次提交哈希码,然后输入:如果要永久撤消它并且已经克隆了一些存储库
提交ID可以通过以下方式查看
然后你可以做 -
只需使用
git
重置它,执行以下命令:Explain: 什么是
git reset
,它基本上是reset
到你要回去的任何提交,然后如果你将它与--soft
键组合,它会返回,但保留你的文件中的更改,所以你回到文件刚刚添加的阶段,HEAD
是分支的负责人,如果你与~1
结合(在这种情况下你也使用HEAD^
),它将只返回一个你想要的提交...我将在下面的图片中为您创建更多详细信息,包括在实际情况中可能发生的所有步骤并提交代码:
撤消上次提交:
git reset --soft HEAD^
或git reset --soft HEAD~
这将撤消上次提交 .
这里
--soft
表示重置为暂存 .HEAD~
或HEAD^
表示在HEAD之前移动到提交 .将最后一次提交替换为新提交:
它将用新提交替换最后一次提交 .
我更喜欢使用
git rebase -i
来完成这项工作,因为会弹出一个很好的列表,我可以选择要删除的提交 . 它可能不像其他答案那样直接,但它感觉恰到好处 .选择要列出的提交数量,然后像这样调用(以获取最后三个)
样品清单
然后Git将删除你的任何行的提交去掉 .
在SourceTree(GitHub的GUI)上,您可以右键单击提交并执行'Reverse Commit' . 这应该撤消您的更改 .
在终端上:
您也可以使用:
要么: