有时候,在使用Git时,您可能要撤消最新的提交Commit。 提交Commit是指定时间的Git存储库的快照。 Git有一个称为HEAD的引用变量,它指向当前工作分支中的最新提交。 要撤消提交,只需将HEAD变量指向先前的快照即可。

本指南介绍了如何撤消上一次Git提交Commit。

不建议撤消已将提交推送到共享存储库的提交。 如果您只想更改提交消息,请查看本文

Git Three-Tree Architecture三树架构

在Git中,您可以使用git reset命令后跟提交标识符来撤消更改。

git reset带有其他参数,可用于控制命令行为。 为了更好地理解reset的工作原理,我们来讨论一下Git的三棵不同的树。 三树架构是Git管理系统的关键概念。 之所以称为树,是因为它们代表文件的集合。

Git管理和操纵以下三棵树:

  • 工作目录-一个目录,包括与存储库关联的本地文件系统上的所有子目录和文件。 它通常被称为“工作树”。 工作目录就像一个沙箱,您可以在其中将更改提交到暂存索引之前对其进行测试。
  • 索引-该树跟踪使用git add添加到索引中的新文件或已更改文件,将其包含在下一个提交中。 它通常称为“staging area”或“staging index”。
  • HEAD-指向当前分支上最后一次提交的指针。

git reset命令具有与三个树对应的三个参数:

  • --soft-将HEAD指针更新为在指定的提交。 工作目录和索引未更改。
  • --mixed -更新HEAD指针,并将索引重置为指定的提交。 工作目录保持不变。 这是reset命令的默认操作模式。
  • --hard -更新HEAD指针,并将索引和工作目录重置为指定的提交。 使用此选项时要格外小心,因为所有您尚未提交的本地更改都会被覆盖并丢失。

撤销上一次提交

要撤消上一次提交而不丢失对本地文件和索引所做的更改,请使用--soft选项调用git reset,后跟HEAD~1

git reset --soft HEAD~1

HEAD~1是指向先前提交的变量。 上面的命令将当前分支后移一个提交,从而有效地撤消您的最后一个提交。 如果运行git status命令,则会看到已更改的文件被列为未提交的更改。

要更新HEAD指针以重置索引,请使用--mixed或不使用选项运行git reset

git reset --mixed HEAD~1

更改的文件会保留,但与前面的示例不同,现在更改不会暂存以提交。

如果您不想保留对文件所做的更改,请使用--hard选项调用git reset命令:

git reset --hard HEAD~1

执行硬重置之前,请确保您不再需要更改。

撤消多次提交

使用git reset,您可以返回到先前的任何提交。

例如,要将当前分支移回三个提交,可以使用:

git reset --hard HEAD~3

由于我们使用的是--hard,因此以上命令将从提交历史记录中删除最新的三个快照。

移回特定提交的另一种方法是将提交ID传递给git reset命令。

使用git log --oneline查找提交ID:

git log --oneline

该命令将显示所有提交的列表,包括ID和提交消息的第一行:

32921222 (HEAD -> master) Update changelog
7505724c adding new tests
750862ce new blog post
95a63417 sort configuration file
252032e4 Refactor User class
...

一旦您知道要重设的提交的ID,只需将ID传递给git reset命令即可:

git reset --hard 95a63417

结论

要撤消上一次提交,请使用git reset命令。 不要重置推送的提交,因为这可能会给您的同事带来很多问题。

如果您遇到问题或有反馈,请在下面发表评论。