协慌网

登录 贡献 社区

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

我不小心将错误的文件提交 Git 了,但我还没有将提交推送到服务器。

如何从本地库中撤消这些提交?

答案

1
liyaoheng
贡献值 20
贡献次数 1

如果你不知道如何工作,撤销提交有点可怕。但是如果你理解的话,这实际上非常容易。

假设你有这个,其中 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 天,所以你通常可以回去拯救一个你并不想要摆脱的东西。