我该如何从本地仓库撤销这些提交?
$ git commit -m "Something terribly misguided" # (0: Your Accident)
$ git reset HEAD~ # (1)
[ edit files as necessary ] # (2)
$ git add . # (3)
$ git commit -c ORIG_HEAD # (4)
git reset
是负责撤销的命令。它会撤销你最后一次提交,同时保留你的工作树(磁盘上文件的状态)不变。你需要再次添加它们,然后才能再次提交。git add
任何你想要包含在新提交中的内容。reset
将旧的头指针复制到 .git/ORIG_HEAD
;使用 -c ORIG_HEAD
进行提交 将打开一个编辑器,最初包含旧提交的日志消息,并允许你进行编辑。如果你不需要编辑消息,可以使用-C
选项。或者,要编辑先前的提交(或仅编辑其提交消息),可以使用commit --amend
将当前索引中的更改添加到先前的提交中。
要删除(而不是还原)已推送到服务器的提交,需要使用git push origin main --force[-with-lease]
来重写历史记录。使用--force
几乎总是一个坏主意;最好使用--force-with-lease
,正如git手册中所述:
如果已经发布了历史记录,您应该了解重写历史记录的影响。
{{link1:您可以使用 git reflog
命令来确定您希望还原的提交的 SHA-1 值。一旦您获得了这个值,按照上述解释的命令顺序进行操作。
HEAD~
和HEAD~1
是一样的。如果你想要取消多个提交,可以参考这篇文章git中的HEAD是什么?。
git checkout theRightBranch
命令将所有已经暂存的更改切换到正确的分支上。就像我刚刚所做的一样。 - Frank Shearargit reset --soft HEAD~1
来代替git reset --soft HEAD^
。因为在DOS中,符号^是一个续行符号,所以在此处无法正确使用。另外,--soft
是默认选项,如果愿意可以省略这个参数,直接使用git reset HEAD~1
即可。 - Ryan Lundyzsh: no matches found: HEAD^
- 您需要转义符号 ^,例如 git reset --soft HEAD\^
。 - tnajdekgit commit -m "Something terribly misguided"
我总是会发出轻笑声。 - 100pic (F)
A-B-C
↑
master
git reset --hard
你想要"销毁提交C并且丢弃所有未提交的更改"。你可以执行以下操作:git reset --hard HEAD~1
(F)
A-B
↑
master
(F)
A-B-C
↑
master
--hard
。git reset HEAD~1
(F)
A-B-C
↑
master
git reset HEAD~1
时,你告诉Git将HEAD指针向后移动一个提交。但是(除非你使用--hard
),你保留了文件的原样。所以现在git status
显示了你在C中检入的更改。你没有丢失任何东西!git reset --soft
为了最轻微的操作,你甚至可以撤销你的提交,但保留你的文件和你的链接。git reset --soft HEAD~1
git reflog
git checkout -b someNewBranchName shaYouDestroyed
git reset --hard~1
命令将把主分支指向特性分支中最后一个提交。在这种情况下,应该使用特定的提交ID而不是相对命令。 - Chris KerekesHEAD~1
中的数字可以替换为任何正整数,例如 HEAD~3
。尽管这似乎很明显,但初学者(比如我)在运行 git 命令时都会非常小心谨慎,因此他们可能不想通过测试来冒险搞砸一些东西。 - Šime Vidasgit revert
git push origin :
- FractalSpace如果你已经将你的提交推送到远程仓库,那么撤销你最后一次提交有两种方法:
假设我已经在本地进行了提交,但现在我想要删除该提交。
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.
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 基础 - 撤销操作。
git revert HEAD^
不是前一个版本,而是前一个版本的前一个。我执行了 git revert HEAD
然后再次推送,它就好了 :) - nacho4d添加/删除文件以使您所需的内容达到理想状态:
git rm classdir
git add sourcedir
然后修改提交:
git commit --amend
之前错误的提交将被编辑以反映新的索引状态 - 换句话说,就像您一开始没有犯错误一样。
请注意,仅在未推送时才应执行此操作。如果您已经推送了,那么您只需正常提交一个修复即可。
git rm --cached
命令将文件从 Git 索引中删除但保留在文件系统中! - xuiqzy这将添加一个新的提交,其中删除了添加的文件。
git rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"
或者你可以重写历史以撤销最后一次提交。
警告:这个命令将永久删除你提交的.java
文件(和任何其他文件)所做的修改,并从你的工作目录中删除所有更改:
git reset --hard HEAD~1
hard reset
到 HEAD-1
会将你的工作副本恢复到错误提交前的状态。
git commit -a -m ""
或 git commit -am ""
。 - trejdergit stash
,然后运行 git stash pop
。 - seanriordan08git reset --hard HEAD-1
非常危险——它不仅仅是"撤销提交",还会删除你所有的更改,这不是提问者所要求的。不幸的是我使用了这个回答(StackOverflow无缘由地将其显示在获得26k赞的已采纳答案之前),现在我将努力恢复我所有的更改。 - Jackgit reflog
查找被丢弃的提交,然后运行 git reset --hard $1
,其中 $1
是你被丢弃的提交。 - seantsang替换索引中的文件:
git rm --cached *.class
git add *.java
如果这是一个私有分支,修改提交记录:
git commit --amend
或者,如果这是一个共享的分支,请创建一个新的提交:
git commit -m 'Replace .class files with .java files'
(如果要更改以前的提交(commit),请使用强大的交互式变基(interactive rebase)。)
ProTip™:将*.class
添加到gitignore文件中可避免此问题再次发生。
如果你需要更改最近一次提交(commit),则修改(commit)是理想的解决方案,但更通用的解决方案是使用reset
命令。
您可以使用以下命令将Git重置到任何提交(commit):
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
git revert
是一个单独的命令,它基本上是“重置”单个提交。 - BenKoshygit revert
会创建一个新的提交来反转给定的更改。这是使用git reset
的更安全的选择。 - gsan使用git revert <commit-id>
命令。
要获取提交ID,只需使用git log
命令。
git revert commit-id
命令,完美解决了问题。当然接下来你需要推送你的更改。 - Casey Robinsongit cherry-pick <<错误提交的哈希值>>
,@astronomerdave。来自差不多晚了2年参加派对的先生。 - Tom Howard如果您计划完全撤消本地提交,无论您在提交上所做的更改如何,如果您不担心任何问题,只需执行以下命令。
git reset --hard HEAD^1
(这个命令将忽略您的整个提交,您的更改将从本地工作树中完全丢失)。如果您想要撤消提交,但希望保留更改在暂存区(就像在 git add
之后提交之前一样),则执行以下命令。
git reset --soft HEAD^1
现在您的已提交文件进入了暂存区。假设您想要将文件从暂存区移除,因为需要编辑一些错误的内容,请执行以下命令
git reset HEAD
现在已经将提交的文件从暂存区移动到未暂存区。现在文件已准备好进行编辑,所以您想要更改的任何内容都需要进行编辑并添加,然后进行新的提交。
我想撤销我们共享仓库中最新的五个提交。我查找了要回滚到的修订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>
git reflog
已经接近你所描述的内容,但它给用户更多的控制权来确定需要(撤销)做的事情。但是请注意,“撤销”在各个地方的工作方式不同,人们会期望这个功能实现许多不同的事情。撤销上一个提交?撤销上一个操作?如果最后一个操作是推送,如何撤销,(重置并推送)还是(撤销并推送)? - Romain Valeri