$ 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~
代替,这就好比是git reset HEAD~
其中HEAD~
相同HEAD~1
)但是现有的更改会暂停。 git add
您想要包含在新提交中的任何内容。 reset
将旧头复制到.git/ORIG_HEAD
; 使用-c ORIG_HEAD
commit
将打开一个编辑器,该编辑器最初包含来自旧提交的日志消息,并允许您对其进行编辑。如果您不需要编辑消息,则可以使用-C
选项。 但请注意,如果您已向索引添加任何新更改,则使用commit --amend
会将它们添加到您之前的提交中。
如果代码已经推送到您的服务器并且您有权覆盖历史记录(rebase),那么:
git push origin master --force
你也可以看看这个答案:
上面的答案将向您展示git reflog
,它用于找出您希望恢复的 SHA-1。一旦找到要撤消的点,就可以使用上面解释的命令序列。
1但是,请注意,如果您在提交消息中犯了错误,则无需重置为先前的提交。更简单的选择是git reset
(为了更新你之后所做的任何更改),然后是git commit --amend
,这将打开预先填充了最后一次提交消息的默认提交消息编辑器。
如果你不知道如何工作,撤销提交有点可怕。但是如果你理解的话,这实际上非常容易。
假设你有这个,其中 C 是你的 HEAD,(F)是你文件的状态。
(F)
A-B-C
↑
master
你想要提交 C 并且永远不会再看到它 。你做这个:
git reset --hard HEAD~1
结果是:
(F)
A-B
↑
master
现在 B 是 HEAD。因为您使用了--hard
,所以您的文件将重置为它们在提交 B 时的状态。
啊,但是假设提交 C 不是灾难,但只是有点偏。您希望撤消提交,但在进行更好的提交之前,请保留更改以进行一些编辑。从这里开始,用 C 作为你的 HEAD:
(F)
A-B-C
↑
master
你可以做到这一点,离开--hard
:
git reset HEAD~1
在这种情况下,结果是:
(F)
A-B-C
↑
master
在这两种情况下,HEAD 只是指向最新提交的指针。当你执行git reset HEAD~1
,你告诉 Git 将 HEAD 指针移回一次提交。但是(除非你使用--hard
)你保留文件原样。所以现在git status
显示你已经检查过 C 的变化。你没有丢失任何东西!
对于最轻微的触摸,您甚至可以撤消提交但保留文件和索引 :
git reset --soft HEAD~1
这不仅会使您的文件单独存在,甚至会使您的索引单独存在。当你执行git status
,你会看到索引中的文件和以前一样。实际上,在这个命令之后,你可以执行git commit
然后你将重做你刚刚提交的同一个提交。
还有一件事: 假设你在第一个例子中销毁了一个提交 , 但后来发现你需要它呢?运气好,对吗?
不, 还是有办法把它找回来。输入git reflog
,你会看到你已经移动的(部分)提交 sha 的列表。找到你销毁的提交,并执行以下操作:
git checkout -b someNewBranchName shaYouDestroyed
你现在已经复活了这个提交。提交实际上并没有在 Git 中被摧毁大约 90 天,所以你通常可以回去拯救一个你并不想要摆脱的东西。
我花了一段时间才弄明白,所以也许这会帮助别人......
根据您是否已将提交公开(推送到远程存储库),有两种方法可以 “撤消” 上次提交:
假设我在本地提交,但现在想删除该提交。
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
之前reset
为提交:
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
将显示我们的上一次提交已被删除。
如果您已将提交公开,则需要创建一个新的提交,它将 “还原” 您在先前提交(当前 HEAD)中所做的更改。
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 - Undoing Things