有时候,在使用Git时,您可能要撤消最新的提交Commit。 提交是指定时间的Git存储库的快照。 Git有一个称为HEAD
的引用变量,它指向当前工作分支中的最新提交。 要撤消提交,只需将HEAD
变量指向先前的快照即可。
本教程介绍了如何撤消Git提交。不建议撤消已将提交推送到远程仓库的提交。 如果您只想更改提交消息,请查看如何修改Git提交消息教程。
Git三树架构Three-Tree Architecture
在Git中,您可以使用git reset
命令后跟提交标识符来撤消更改。git reset
带有其他参数,可用于控制命令行为。 为了更好地理解reset
的工作原理。
我们来讨论一下Git的三棵不同的树。 三树架构是Git管理系统的关键概念。 之所以称为树,是因为它们代表文件的集合。Git可以管理和操纵以下三棵树包括:
工作目录,它是一个目录,包括与存储库关联的本地文件系统上的所有子目录和文件。 它通常被称为工作树
。 工作目录就像一个沙箱,您可以将更改提交到索引之前对其进行测试。
索引跟踪git add
命令添加到索引中的新文件或已更改文件,并将其包含在下一个提交中。 它通常称为staging area
或staging 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
命令。 不要重置已推送的提交,因为这可能会给您的同事带来很多问题。如果您遇到问题或有反馈,请在下面发表评论。