如何撤消Git中最近的本地提交?

git version-control git-commit undo pre-commit 传说哥 | 2020-02-02 19:35:06


我意外地将错误的文件提交给Git,但我还没有将提交推送到服务器。
如何从本地存储库撤消这些提交?


本站提供【Linux疑难问题解决】50元起 ,【爬虫开发】200元起。欢迎咨询QQ:376667689 点击这里给我发消息



30 回答


22213


撤消commit并重做
$ git commit -m "Something terribly misguided"             # (1)
$ git reset HEAD~ # (2)
<< edit files as necessary >> # (3)
$ git add ... # (4)
$ git commit -c ORIG_HEAD # (5)

这是您要撤消的操作。
这对您的工作树(磁盘上文件的状态)没有任何作用,但撤消提交并保留您提交的更改未保存(因此它们将在
git status中显示为“更改未暂存以供提交”
,所以在提交之前需要再次添加它们)。如果您只想对上一次提交添加更多更改,或更改提交消息1,则可以使用
git reset --soft HEAD~
,这就像代码>(3) < /PRE> > 2,但让您现有的更改发生。
对工作树文件进行修改。
< PRE> >代码> [代码4 ] /代码> < /PRE> >您希望包含在新提交中的任何内容。
提交更改,重用旧提交消息。
reset
将旧头复制到
.git/ORIG_HEAD
commit
-c ORIG_HEAD
将打开一个编辑器,该编辑器最初包含来自旧commit的日志消息,并允许您对其进行编辑。如果不需要编辑邮件,可以使用
-C
选项。
但是,请注意,如果您对索引添加了任何新更改,使用
commit --amend
会将它们添加到您以前的提交中。
如果代码已经推送到您的服务器,并且您有权覆盖历史记录(rebase),则:
git push origin master --force

您还可以查看此答案:
如何将头移回以前的位置?(分离的头)&Undo commits
上面的答案将显示
git reflog
,用于找出您希望还原到的SHA-1是什么。一旦找到要撤消的点,即可使用上述命令序列。
1但是,请注意,如果您只是在提交消息中出错,则不需要重置为以前的提交。更简单的选项是
git reset
(取消保存此后所做的任何更改),然后
git commit --amend
,这将打开默认的提交消息编辑器,该编辑器预先填充了最后一条提交消息。
2
HEAD~
HEAD~1
相同。也看到什么是头在吉特?。如果要取消提交多个提交,这将很有帮助。

2020-02-02 19:35:18
凉宫春喵喵

10535


如果你不知道它是如何运作的,那么撤销一个承诺就有点可怕。但如果你真的理解了,这实际上是非常容易的。
假设你有这个,其中C是你的头,(F)是你的文件的状态。
   (F)
A-B-C

master

你想用核弹攻击commit C,然后再也看不到它。你这样做:
git reset --hard HEAD~1

结果是:
 (F)
A-B

master

现在B是头。因为您使用了
--hard
,所以您的文件在提交B时会重置为其状态。
啊,但假设提交C不是灾难,只是有点不正常。您希望撤消提交,但在执行更好的提交之前,请保留更改以进行编辑。从这里开始,以C为头:
   (F)
A-B-C

master

您可以这样做,去掉
--hard

git reset HEAD~1

在这种情况下,结果是:
   (F)
A-B-C

master

在这两种情况下,头只是指向最新提交的指针。当您执行
git reset HEAD~1
时,您告诉Git将头指针移回一次提交。但是(除非您使用
--hard
),否则您会保留原来的文件。所以现在
git status
显示您签入C的更改。您没有丢失任何东西!
为了获得最轻的触控,您甚至可以撤消提交,但保留文件和索引:
git reset --soft HEAD~1

这不仅使您的文件单独存在,甚至使您的索引单独存在。当您执行
git status
操作时,您将看到索引中的文件与以前一样。实际上,就在这个命令之后,您可以执行
git commit
并重新执行刚才的提交。
还有一件事:假设您像第一个示例中那样销毁提交,但之后发现您毕竟需要它?运气不好,对吧?
不,还有办法找回它。键入
git reflog
,您将看到一个已移入的(部分)提交SHA-1哈希的列表。找到您销毁的提交,然后执行以下操作:
git checkout -b someNewBranchName shaYouDestroyed

您现在已经恢复了该提交。提交实际上在90天内不会在Git中被销毁,因此您通常可以返回并营救一个您不打算删除的提交。

2020-02-02 19:35:18
樱道研

2052


有两种方法可以“撤消”上一次提交,具体取决于您是否已将提交公开(推送到远程存储库):
如何撤消本地提交
假设我已在本地提交,但现在我要删除该提交。
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 log
将显示上一次提交已被删除。
如果您已将提交公开,则如何撤消公共提交
,您将要创建一个新的提交,它将“还原”您在上一次提交(当前头)中所做的更改。
git revert HEAD

您的更改现在将被还原并准备好提交:
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

有关详细信息,请查看Git Basics-撤消操作。

2020-02-02 19:35:18
redskylala

1722


添加/删除文件以获得所需的内容:
git rm classdir
git add sourcedir

然后修改提交:
git commit --amend

将编辑以前的错误提交以反映新的索引状态-换句话说,一开始就好像你从来没有犯过错误。
请注意,只有在你还没有推动的情况下才应该这样做。如果你已经推了,那么你只需要正常提交一个修复程序。

2020-02-02 19:35:18
堕叶

989


git rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"


git reset --hard HEAD~1

警告:上述命令将永久删除对您要提交的
.java
文件(以及任何其他文件)的修改。
将工作副本设置为在你错误的承诺之前承诺。

2020-02-02 19:35:18
abccwoos

756


若要更改上一次提交,请替换索引中的文件:
git rm --cached *.class
git add *.java

然后,如果它是私有分支,请修改提交:
git commit --amend

或者,如果它是共享分支,请重新提交:
git commit -m 'Replace .class files with .java files'

(若要更改上一次提交,请使用令人敬畏的交互式折扣。)
ProTip™:添加
*.class
转换为gitignore以阻止这种情况再次发生。
如果需要更改最后一次提交,则还原提交是理想的解决方案,但更一般的解决方案是
reset

可以使用以下命令将Git重置为任何提交:
git reset @~N

其中
N
HEAD
@~
之前的提交数将重置为以前的提交。
因此,您可以使用:
git reset @~
git add *.java
git commit -m "Add .java files"

签出
git help reset
,特别是关于
--soft
--mixed
--hard
的章节,以便更好地理解这一功能。
如果您搞砸了,可以始终使用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

2020-02-02 19:35:18
他喵的他喵的

651


使用
git revert 

获取提交ID,只需使用
git log

2020-02-02 19:35:18
魔炮

519


如果计划完全撤消本地提交,则无论对提交所做的更改是什么,如果对此不担心,只需执行以下命令即可。
git reset --hard HEAD^1

(此命令将忽略整个提交,并且您的更改将从本地工作树中完全丢失)。如果要撤消提交,但希望在暂存区域中进行更改(在提交之前,就像在
git add
之后一样),请执行以下命令。
git reset --soft HEAD^1

现在,提交的文件将进入暂存区域。假设由于需要编辑一些错误的内容,如果要对文件进行后台处理,请执行以下命令
git reset HEAD

现在提交的文件将从后台处理区域进入未后台处理区域。现在文件可以编辑了,所以无论您做了什么更改,您都要进行编辑并添加它,然后重新提交/重新提交。
更多

2020-02-02 19:35:18
纱布調

487


如果安装了Git Extras,则可以运行
git undo
来撤消最新提交。
git undo 3
将撤消最后三次提交。

2020-02-02 19:35:18
MS

456


我想撤销共享存储库中最近的五次提交。我查找了要回滚到的修订id。然后我输入以下内容。
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 git@bitbucket.org:thecompany/prometheus.git
+ 09a6480...5a74047 master -> master (forced update)
prompt>

2020-02-02 19:35:18
陌客

430


我更喜欢使用
git rebase -i
来完成这项工作,因为会弹出一个很好的列表,在其中我可以选择要删除的提交。它可能不像这里的其他一些答案那样直接,但它感觉很好。
选择要列出的提交数,然后像这样调用(登记最后三个提交)
git rebase -i HEAD~3

示例列表
pick aa28ba7 Sanity check for RtmpSrv port
pick c26c541 RtmpSrv version option
pick 58d6909 Better URL decoding support

然后Git将删除您删除的任何行的提交。

2020-02-02 19:35:18
便当少年

415


如何修复以前的本地提交
使用git gui(或类似的)执行
git commit --amend
。在GUI中,您可以从提交中添加或删除单个文件。您还可以修改提交消息。
如何撤消以前的本地提交,只需将分支重置到以前的位置(例如,使用
gitk
git rebase
)。然后重新应用保存副本中的更改。在本地存储库中进行垃圾收集之后,就好像从未发生过不需要的提交一样。要在一个命令中完成所有这些操作,请使用
git reset HEAD~1

警告语:不小心使用
git reset
会使工作副本陷入混乱状态。我建议Git新手尽量避免这种情况。
如何撤消公共提交
执行反向樱桃选择(Git revert)来撤消更改。
如果您还没有将其他更改拉到分支上,您只需执行…
git revert --no-edit HEAD

然后将更新的分支推送到共享存储库。
提交历史将显示两个提交,另外。
高级:更正公共存储库中的私人分支
这可能很危险--请确保您有分支的本地副本可供拒绝。
还请注意:如果其他人可能正在处理分支,则不希望这样做。
git push --delete (branch_name) ## remove public version of branch

然后在本地清理分支拒绝……
git push origin (branch_name)

在正常情况下,您可能不必担心您的私有分支提交历史是原始的。只需推送一个后续提交(请参阅上面的“如何撤消公共提交”),然后,执行挤压合并以隐藏历史记录。

2020-02-02 19:35:18
三界幽灵

330


如果您提交了垃圾邮件但未推送,则
git reset --soft HEAD~1

HEAD~1是“提交前提交”的简写。或者,如果要重置为,可以引用散列的SHA-1。--软选项将删除提交,但它将保留您所有更改的文件“要提交的更改”,就像git status所说的那样。
如果您希望消除自头使用前提交以来对工作树中跟踪文件所做的任何更改“-hard”而不是。

如果您已经推送并有人拉取,通常是我的情况,不能使用git reset。但是,您可以执行git还原,
git revert HEAD

这将创建一个新的提交,该提交将反转意外提交引入的所有内容。

2020-02-02 19:35:18
酷酷

329


如果您想永久撤消它,并且已经克隆了某个存储库,则可以通过
git log 

查看提交id,然后可以执行-
git reset --hard 
git push origin -f

2020-02-02 19:35:18
bbdanss121

279


在SourceTree(GitHub的GUI)上,您可以右键单击提交并执行“反向提交”。这将撤消您的更改。
在终端上:
您可以选择使用:
git revert

或:
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.

2020-02-02 19:35:18
阴影下的猫

259

单个命令:

git reset --soft 'HEAD^' 

创建最后一个本地提交非常有用!

2020-02-02 19:35:18
卡通叔叔

251


只需reset它使用
git

git reset --soft HEAD~1

解释:什么是
git reset
所做的,它基本上是将
重置为您想返回的任何提交,然后如果您将其与
--soft
键结合使用,它将返回,但保留您的更改文件,因此返回到刚刚添加文件的阶段,
HEAD
是分支的负责人,如果您与
~1
结合使用(在这种情况下,您还使用
HEAD^
),它将只返回一个您想要的提交…
我将在下面的图像中创建步骤,以获得更多详细信息您,包括在实际情况下可能发生的所有步骤,并提交代码:

2020-02-02 19:35:18
十个字是名字的极限呢

231


如何撤消上次Git提交?
要将所有内容还原到上次提交之前的方式,我们需要重置为头前提交。
如果不想保留所做的更改:
git reset --hard HEAD^

如果要保留更改:
git reset --soft HEAD^

现在检查git日志。它将显示上一次提交已被删除。

2020-02-02 19:35:18
绝望的百合控

187


使用reflog查找正确的状态
git reflog

重置前的reflog
选择正确的reflog(在我的情况下为f3cb6e2)并键入
git reset --hard f3cb6e2

之后,将repo头重置为重置后的HEADid
日志
最后,reflog如下图所示

2020-02-02 19:35:18
chopper2

184


“将工作树重置为最后一次提交”
git reset --hard HEAD^ 

“从工作树中清除未知文件”
git clean    

请参阅-Git快速参考
注意:此命令将删除以前的提交,因此请谨慎使用!
git reset --hard
更安全。

2020-02-02 19:35:18
扎古

162


首先运行:
git reflog

它将显示您在存储库上执行的所有可能操作,例如提交、合并、拉取等。
然后执行:
git reset --hard ActionIdFromRefLog

2020-02-02 19:35:18
苏苏

154

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<替换最后提交到新的提交:

git commit --amend -m "message"

它将用新的提交替换最后的提交。

2020-02-02 19:35:18
DaMnGreed

150


另一种方法:
签出要还原的分支,然后将本地工作副本重置回要成为远程服务器上最新的提交(之后的所有操作都将拜拜)。为此,在SourceTree中,我右键单击并选择“Reset BRANCHNAME To this commit”。
然后导航到存储库的本地目录并运行此命令:
git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME

这将删除本地存储库中当前提交之后的所有提交,但仅删除该分支的所有提交。

2020-02-02 19:35:18
SisterHunter

141


键入
git log
并找到最后一个提交哈希代码,然后输入:
git reset 

2020-02-02 19:35:18
UID3739

136


在我的案例中,我无意中提交了一些我不想提交的文件。所以我做了如下的工作:
git reset --soft HEAD^
git rm --cached [files you do not need]
git add [files you need]
git commit -c ORIG_HEAD

使用gitk或git log--stat

2020-02-02 19:35:18
飞机上的熊猫

130


简单,在命令行中运行此命令:
git reset --soft HEAD~ 

2020-02-02 19:35:18
不老猎人DAZE

125


有很多方法可以做到这一点:
撤消上一次提交/上一次提交的Git命令:
警告:如果不知道自己在做什么,请不要使用--hard。
--hard太危险了,它可能会删除您的文件。
在Git中还原提交的基本命令是:
$ git reset --hard 


$ git reset --hard HEAD~

提交的ID:commit的ID
n:是您要还原的最后提交数
您可以获得提交ID,如下所示:
$ **git log --oneline**
d81d3f1 function to subtract two numbers
be20eb8 function to add two numbers
bedgfgg function to mulitply two numbers

其中d81d3f1和be20eb8是commitid.
现在让我们看看一些情况:
假设您希望还原上次提交的“d81d3f1”。这里有两个选项:
$ git reset --hard d81d3f1


$ git reset --hard HEAD~1

假设您想要还原提交“be20eb8”:
$ git reset --hard be20eb8

有关更详细的信息,您可以参考并尝试一些其他命令将磁头重置为指定状态:
$ git reset --help

2020-02-02 19:35:18
比丘,不解释

122


若要重置为上一版本,请永久删除所有未提交的更改:
git reset --hard HEAD~1

2020-02-02 19:35:18
四方茉莉

122


使用SourceTree(Git的图形工具)查看提交和树。您可以直接用鼠标右键手动重置。

2020-02-02 19:35:18
水虿

121


对于本地提交
git reset --soft HEAD~1

或者如果您不确切地记得它是在哪个提交中,则可以使用
git rm --cached 

对于推送提交
从存储库历史记录中删除文件的正确方法是使用
git filter-branch
。也就是说,
git filter-branch --index-filter 'git rm --cached ' HEAD

但我建议您小心使用此命令。阅读git filter branch(1)手册页。

2020-02-02 19:35:18
小V



Copyright © 2019-2020 zimt8.com
备案号:湘ICP备19012068号