13911
10609
我不小心将错误的文件提交给Git,但尚未将提交推送到服务器。
如何撤消本地存储库中的那些提交? 
1个
2
3
下一个
撤消提交并重做
$ git commit -m“某些东西被严重误导了”#(0:您的事故)
$ git reset HEAD〜#(1)
<<根据需要编辑文件>>#(2)
$ git添加。 #(3)
$ git commit -c ORIG_HEAD#(4)
此命令负责撤消。它将撤消您的最后一次提交,同时保持工作树(磁盘上文件的状态)不变。您需要再次添加它们,然后才能再次提交它们。
对工作树文件进行更正。
git添加要包含在新提交中的任何内容。
提交更改,重新使用旧的提交消息。重置将旧的头复制到.git / ORIG_HEAD;用-c提交ORIG_HEAD将打开一个编辑器,该编辑器最初包含旧提交的日志消息,并允许您对其进行编辑。如果不需要编辑消息,则可以使用-C选项。
另外,要编辑先前的提交(或仅编辑其提交消息),commit --amend会将当前索引内的更改添加到先前的提交。
要删除(而不是还原)已推送到服务器的提交,必须使用git push origin master --force重写历史记录。
进一步阅读
如何将HEAD移回先前的位置? (独立的头部)和撤消提交
上面的答案将向您显示git reflog,您可以使用它来确定要还原到的提交的SHA-1。获得此值后,请按照上述说明使用命令序列。
HEAD〜与HEAD〜1相同。文章git中的HEAD是什么?如果您要取消提交多个提交,则很有帮助。
|
如果您不知道提交的工作方式,则撤消提交会有些吓人。但是,如果您理解的话,实际上非常容易。我将向您展示撤销提交的4种不同方式。
选项1:git reset --hard
假设您有这个,其中C是您的HEAD,(F)是您的文件状态。
(F)
A-B-C
↑
主
您想核对提交C,再也看不到它,并且丢失本地修改文件中的所有更改。你来做这件事:
git reset --hard HEAD〜1
结果是:
(F)
A-B
↑
主
现在B是HEAD。因为使用了--hard,所以文件在提交B时被重置为其状态。
选项2:git重置
嗯,但是假设提交C并不是一场灾难,只是有点困难。您想要撤消提交,但是在进行更好的提交之前,请保留更改以进行一些编辑。从这里再次开始,以C作为您的HEAD:
(F)
A-B-C
↑
主
您可以这样做,而不必使用--hard:
git reset HEAD〜1
在这种情况下,结果为:
(F)
A-B-C
↑
主
在这两种情况下,HEAD都只是指向最新提交的指针。当您执行git reset HEAD〜1时,您告诉Git将HEAD指针移回一次提交。但是(除非您使用--hard),否则文件将保持原样。因此,现在git status显示您已签入C的更改。您还没有丢失任何东西!
选项3:git reset --soft
对于最轻松的接触,您甚至可以撤消提交,但保留文件和索引:
git reset --soft HEAD〜1
这不仅让您的文件独自一人,甚至使索引也独自一人。当执行git status时,您会看到索引中的文件与以前一样。实际上,在此命令之后,您可以执行git commit,并且将重做刚才的相同提交。
选项4:您进行了git reset --hard操作,需要返回该代码
还有一件事:假设您像第一个示例一样破坏了一个提交,但之后发现您毕竟需要它?运气不好吧?
不,仍然有办法找回它。输入git reflog,您将看到移入其中的(部分)提交列表(即哈希)的列表。找到您破坏的提交,然后执行以下操作:
git checkout -b someNewBranchName shaYouDestroyed
您现在已经复活了该提交。在Git中,提交实际上并没有被销毁约90天,因此您通常可以回去拯救不是故意要摆脱的一个。
|
有两种方法可以“撤消”您的上一次提交,具体取决于您是否已将提交公开(推送到远程存储库):
如何撤消本地提交
假设我在本地提交了,但是现在我想删除该提交。
git日志
提交101:错误的提交#最新提交。这将被称为“ HEAD”。
提交100:良好提交#倒数第二次提交。这是我们想要的。
要将所有内容恢复到上一次提交之前的状态,我们需要重置为HEAD之前的提交:
git reset --soft HEAD ^#如果要保留更改,请使用--soft
git reset --hard HEAD ^#如果不关心保留所做的更改,请使用--hard
现在,git log将显示我们的上一次提交已被删除。
如何撤消公共承诺
如果已经将提交公开,则需要创建一个新的提交,该提交将“还原”您在先前提交(当前HEAD)中所做的更改。
git恢复头
您的更改现在将恢复并准备好提交:
git commit -m'恢复我意外删除的文件'
git日志
提交102:恢复我意外删除的文件
提交101:删除我们不需要的文件
承诺100:添加我们需要的文件
有关更多信息,请查看Git基础知识-撤消事情。
|
添加/删除文件以所需的方式获取内容:
git rm classdir
git添加sourcedir
然后修改提交:
git commit-修改
先前的错误提交将被编辑以反映新的索引状态-换句话说,就好像您从未犯过错误。
请注意,只有在尚未推送的情况下,才应该这样做。如果已推送,则只需正常提交修复程序即可。
|
git rm yourfiles / *。class
git commit -a -m“删除了文件夹'yourfiles'中的所有类文件”
要么
git reset --hard HEAD〜1
警告:上面的命令将永久删除您要提交的对.java文件(和任何其他文件)的修改。
硬重置为HEAD-1会将您的工作副本设置为错误提交之前的提交状态。
|
更改最后一次提交
替换索引中的文件:
git rm-缓存* .class
git添加* .java
然后,如果它是一个私有分支,则修改提交:
git commit-修改
或者,如果它是一个共享分支,请重新提交:
git commit -m'用.java文件替换.class文件'
(要更改以前的提交,请使用令人敬畏的交互式rebase。)
ProTip™:将* .class添加到gitignore中,以阻止这种情况再次发生。
还原提交
如果需要更改最后的提交,则修改提交是理想的解决方案,但是会重置更通用的解决方案。
您可以使用以下命令将Git重置为任何提交:
git reset @〜N
其中N是HEAD之前的提交次数,@〜重置为前一个提交。
因此,您可以使用:
git reset @〜
git添加* .java
git commit -m“添加.java文件”
请查看git help reset,特别是有关--soft --mixed和--hard的部分,以更好地了解其功能。
刷新日志
如果您搞砸了,可以随时使用reflog查找丢弃的提交:
$ git reset @〜
$ git reflog
c4f708b HEAD @ {0}:重置:移至@〜
2c52489 HEAD @ {1}:提交:添加了一些.class文件
$ git reset 2c52489
...而您又回到了起点
|
使用git revert 。
要获取提交ID,只需使用git log。
|
如果您打算完全撤消本地提交,那么您对提交所做的任何更改,如果您对此不担心,只需执行以下命令即可。
git reset --hard HEAD ^ 1
(此命令将忽略您的整个提交,并且您的更改将完全从本地工作树中丢失)。如果要撤消提交,但是要在登台区域中进行更改(在提交之前就像在git add之后一样),请执行以下命令。
git reset --soft HEAD ^ 1
现在,您提交的文件进入暂存区域。假设如果要升级文件,因为需要编辑一些错误的内容,请执行以下命令
git reset HEAD
现在已提交的文件将从暂存区域进入未暂存区域。现在文件已准备好进行编辑,因此无论您进行什么更改,都希望对其进行编辑并添加它,然后进行新的/新的提交。
更多(链接断开)(存档版本)
|
如果安装了Git Extras,则可以运行git undo撤消最新的提交。 git undo 3将撤消最后三个提交。
|
我想撤消我们共享存储库中的最新五次提交。我查找了要回滚的修订版ID。然后我输入以下内容。
提示> git reset --hard 5a7404742c85
HEAD现在位于5a74047
提示> git push origin master --force
总计0(增量0),重用0(增量0)
远程:bb / acl:允许新生儿。接受的有效载荷。
到git@bitbucket.org:thecompany / prometheus.git
+ 09a6480 ... 5a74047主机->主机(强制更新)
提示>
|
我更喜欢使用git rebase -i来完成这项工作,因为会弹出一个不错的列表,我可以在其中选择要删除的提交。它可能不像这里的其他答案那么直接,但是感觉不错。
选择要列出的提交数量,然后像这样调用(以列出最后三个)
git rebase -i HEAD〜3
样品清单
为RtmpSrv端口选择aa28ba7完整性检查
选择c26c541 RtmpSrv版本选项
选择58d6909更好的URL解码支持
然后,Git将删除您删除的任何行的提交。
|
如何修复先前的本地提交
使用git-gui(或类似的工具)执行git commit --amend。在GUI中,您可以从提交中添加或删除单个文件。您也可以修改提交消息。
如何撤消之前的本地提交
只需将分支重置到先前的位置即可(例如,使用gitk或git rebase)。然后从保存的副本重新应用您的更改。在本地存储库中进行垃圾回收之后,就像从未发生过不需要的提交一样。要在单个命令中完成所有这些操作,请使用git reset HEAD〜1。
字警告:粗心地使用git reset是使工作副本进入混乱状态的好方法。我建议Git新手尽量避免这样做。
如何撤消公共承诺
执行反向Cherry Pick(git-revert)撤消更改。
如果您尚未将其他更改添加到分支中,则只需执行...
git revert --no-edit头
然后将更新后的分支推送到共享存储库。
提交历史记录将分别显示两个提交。
高级:更正公共存储库中的私有分支
这可能很危险-确保您具有要重新推送的分支的本地副本。
另请注意:如果其他人可能正在分支上工作,则您不想这样做。
git push --delete(branch_name)##删除分支的公共版本
在本地清理您的分支,然后重新启动...
git push origin(分支名称)
在通常情况下,您可能不必担心自己的私人分支提交历史记录很原始。只需推送一个后续提交(请参见上面的“如何撤消公共提交”),然后再执行壁球合并即可隐藏历史记录。
|
如果您想永久撤消它,并且已经克隆了一些存储库
提交ID可以通过
git日志
然后,您可以-
git reset --hard <提交ID>
git push origin <分支名称> -f
|
如果您犯了垃圾但没有被推,
git reset --soft HEAD〜1
HEAD〜1是head之前提交的简写。或者,如果您想重置为哈希,则可以引用哈希的SHA-1。 --soft选项将删除提交,但会保留所有更改的文件“要提交的更改”,因为git status会将其保存。
如果要摆脱对工作树中跟踪文件的任何更改,因为从头开始提交之前,请使用“ --hard”。
要么
如果您已经推送并且有人拉了(通常是我的情况),则不能使用git reset。但是,您可以执行git revert,
git恢复头
这将创建一个新的提交,以撤消意外提交所引入的所有内容。
|
在SourceTree(适用于GitHub的GUI)上,您可以右键单击提交并执行“反向提交”。这应该撤消您的更改。
在终端上:
您也可以使用:
git还原
要么:
git reset --soft HEAD ^#如果要保留更改,请使用--soft。
git reset --hard HEAD ^#如果您不关心保留更改,请使用--hard。
|
单个命令:
git reset --soft'HEAD ^'
撤消上一次本地提交非常有用!
|
只需使用git使用以下命令将其重置:
git reset --soft HEAD〜1
说明:git reset的作用,基本上是将其重置为您要返回的任何提交,然后,如果将其与--soft key结合使用,它将返回,但会将更改保留在文件中,因此返回到刚刚添加文件的阶段,HEAD是分支的头,如果与〜1组合(在这种情况下,您还使用HEAD ^),它将仅返回您想要的一次提交。 ..
我在下图中为您创建了更详细的步骤,包括在实际情况下和提交代码时可能发生的所有步骤:
|
如何撤消最后的Git提交?
为了将所有内容恢复到上一次提交之前的状态,我们需要重置为HEAD之前的提交。
如果您不想保留所做的更改,请执行以下操作:
git reset --hard HEAD ^
如果要保留更改:
git reset --soft HEAD ^
现在检查您的git日志。它将显示我们的上一次提交已被删除。
|
“将工作树重置为最后一次提交”
git reset --hard HEAD ^
“从工作树中清除未知文件”
git clean
请参阅-Git快速参考
注意:此命令将删除您以前的提交,因此请谨慎使用! git reset --hard更安全。
|
使用reflog查找正确的状态
git reflog
重置前重新记录
选择正确的引用日志(在我的情况下为f3cb6e2)并输入
git reset --hard f3cb6e2
之后,回购HEAD将重置为该HEADid
重置后记录
最后,reflog如下图所示
最后完成
|
首轮:
git reflog
它将向您显示您已对存储库执行的所有可能操作,例如,提交,合并,拉取等。
然后做:
git reset --hard ActionIdFromRefLog
|
撤消上一次提交:
git reset --soft HEAD ^或git reset --soft HEAD〜
这将撤消上一次提交。
在这里--soft表示重置为暂存。
HEAD〜或HEAD ^表示要在HEAD之前提交。
将最后的提交替换为新的提交:
git commit --amend -m“消息”
它将用新的提交替换最后的提交。
|
其他方式:
签出要还原的分支,然后将本地工作副本重置回要成为远程服务器上最新提交的提交(之后的所有操作都将再见)。为此,我在SourceTree中右键单击,然后选择“将BRANCHNAME重置为此提交”。
然后导航到存储库的本地目录并运行以下命令:
git -c diff.mnemonicprefix = false -c core.quotepath = false push -v -f --tags REPOSITORY_NAME分支名称:分支名称
这将删除本地存储库中当前提交之后的所有提交,但仅针对该分支。
|
键入git log并找到最后一个提交哈希码,然后输入:
git reset <上一个合作伙伴>
|
就我而言,我意外地提交了一些我不想提交的文件。所以我做了以下工作,它起作用了:
git reset --soft HEAD ^
git rm --cached [不需要的文件]
git add [您需要的文件]
git commit -c ORIG_HEAD
使用gitk或git log --stat验证结果
|
很简单,在命令行中运行以下命令:
git reset --soft HEAD〜
|
主要有两种情况
您尚未推送提交
如果问题是您提交了多余的文件(并且您不希望这些文件存储在存储库中),则可以使用git rm删除它们,然后使用--amend提交
git rm 
您还可以使用-r删除整个目录,甚至可以与其他Bash命令结合使用
git rm -r <路径到目录>
git rm $(查找-name'* .class')
删除文件后,可以使用--amend选项进行提交
git commit --amend -C HEAD#-C选项将使用相同的提交消息
这将重写您最近的本地提交,从而删除了多余的文件,因此,这些文件将永远不会在推送时发送,也将由GC从您的本地.git存储库中删除。
您已经推送了提交
您可以应用其他方案的相同解决方案,然后使用-f选项进行git push,但是不建议这样做,因为它会用不同的更改覆盖远程历史记录(它可能会使您的存储库混乱)。
相反,您必须在没有--amend的情况下进行提交(记住有关-amend`的信息:该选项将重写上一次提交的历史记录)。
|
对于本地提交
git reset --soft HEAD〜1
或者,如果您不记得确切的提交时间,则可以使用
git rm-缓存<文件>
对于推送的提交
从存储库历史记录中删除文件的正确方法是使用git filter-branch。那是,
git filter-branch --index-filter'git rm --cached <文件>'HEAD
但我建议您谨慎使用此命令。在git-filter-branch(1)手册页上阅读更多内容。
|
要重置为先前的版本,请永久删除所有未提交的更改:
git reset --hard HEAD〜1
|
使用什么,重设--soft或重设--hard?
我只是为@Kyralessa的答案加上两美分:
如果您不确定要使用什么,请使用--soft(为了安全起见,我使用此约定记住了--soft)。
为什么呢
如果您错误地选择--hard,则将丢失您以前所做的更改。
如果错误地选择--soft,则可以通过应用其他命令来获得--hard相同的结果
git reset HEAD file.html
git checkout-file.html
完整的例子
回显“一些更改...”> file.html
git添加file.html
git commit -m“错误的提交”
#我需要重设
git reset --hard HEAD〜1(取消更改)
# 要么
git reset --soft HEAD〜1#返回登台
git reset HEAD file.html#返回工作目录
git checkout-file.html#取消更改
致谢@Kyralessa。
|
1个
2
3
下一个
高度活跃的问题。赢得10个声誉才能回答这个问题。信誉要求有助于保护该问题免受垃圾邮件和非答复活动的侵害。
不是您要找的答案?浏览标记为git version-control git-commit undo的其他问题,或提出您自己的问题。