本文介绍如何撤消上一次的Git提交的方法。
前言 有时,在使用Git时,您可能要撤消最新的提交。提交是给定时间的Git存储库的快照,Git有一个称为HEAD的引用变量,它指向当前工作分支中的最新提交,要撤消提交,只需将HEAD变量指向先前的快照即可。不建议撤消已将提交推送到共享存储库的提交。如果您只想更改提交消息,请查看本文。 安装Git参考:在Debian 10 Linux系统上安装Git及配置Git的方法。
Git三树架构 在Git中,您可以使用git reset命令和提交标识符来撤消更改。 git reset使用其他参数,使您可以控制命令行为。为了更好地了解重置的工作方式,我们来讨论一下Git的三棵不同的树,三树架构是Git管理系统的关键概念,它们之所以称为树,是因为它们代表文件的集合。 Git管理和操作以下三棵树: 1、工作目录-一个目录,包括与存储库关联的本地文件系统上的所有子目录和文件,它通常被称为“工作树(working tree)”,工作目录类似于沙箱,您可以在其中测试更改,然后再将其提交到暂存索引。 2、索引-此树跟踪使用git add添加到索引中的新文件或更改文件,这些文件将包含在下一次提交中,它通常称为“登台区域(staging area)”或“登台索引(staging index)”。 3、HEAD-指向当前分支上最后一次提交的指针。 git reset命令具有与三个树对应的三个参数: 1]、--soft-将HEAD指针更新为给定的提交,工作目录和索引不会更改。 2]、--mixed-更新HEAD指针,并将Index重置为指定的提交,工作目录保持不变,这是reset命令的默认操作模式。 3]、--hard-更新HEAD指针,并将Index和Working目录重置为指定的提交,使用此选项时要格外小心,因为所有您尚未提交的本地更改都会被覆盖并丢失。
撤消最后一次提交 要撤消上一次提交而不丢失对本地文件和索引所做的更改,请使用--soft选项和HEAD~1调用git reset: git reset --soft HEAD~1 HEAD~1是指向先前提交的变量。上面的命令将当前分支后移一个提交,从而有效地撤消您的最后一个提交,如果您运行git status命令,则会看到已更改的文件被列为未提交的更改。 要更新HEAD指针以重置索引,请使用--mixed或不带选项运行git reset: git reset --mixed HEAD~1 git reset 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命令。不要重置推送的提交,因为这可能会给您带来很多问题。
相关主题 |