myfreax

如何撤销Git提交

有时候,在使用Git时,您可能要撤消最新的提交Commit。 提交Commit是指定时间的Git存储库的快照。本指南介绍了如何撤消上一次Git提交Commit

4 min read
By myfreax
如何撤销Git提交

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

本教程介绍了如何撤消Git提交。不建议撤消已将提交推送到远程仓库的提交。 如果您只想更改提交消息,请查看如何修改Git提交消息教程。

Git三树架构Three-Tree Architecture

在Git中,您可以使用git reset命令后跟提交标识符来撤消更改。git reset带有其他参数,可用于控制命令行为。 为了更好地理解reset的工作原理。

我们来讨论一下Git的三棵不同的树。 三树架构是Git管理系统的关键概念。 之所以称为树,是因为它们代表文件的集合。Git可以管理和操纵以下三棵树包括:

工作目录,它是一个目录,包括与存储库关联的本地文件系统上的所有子目录和文件。 它通常被称为工作树。 工作目录就像一个沙箱,您可以将更改提交到索引之前对其进行测试。

索引跟踪git add命令添加到索引中的新文件或已更改文件,并将其包含在下一个提交中。 它通常称为staging areastaging index

HEAD-指向当前分支上最后一次提交的指针。

现在已经说明了Git的三树架构,接下来我们看看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查找提交的hash啥希:

git log --oneline

该命令将显示所有提交的列表,包括提交的hash啥希和提交消息:

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

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

git reset --hard 95a63417

结论

要撤消上一次提交,请使用git reset命令。 不要重置已推送的提交,因为这可能会给您的同事带来很多问题。如果您遇到问题或有反馈,请在下面发表评论。