撤销 Git 操作
一、撤销提交
当 commit 后,想要撤销。使用:
1 | git revert HEAD |
原理:在当前提交后面,新增一次提交,抵消掉上一次提交导致的所有变化。他不会改变过去的历史,没有任何丢失代码的风险,是首选方法
如果想要抵消多个提交,必须在命令行依次指定这些提交。如下:
1 | git revert [倒数第一个提交] [倒数第二个提交] |
git revert 命令还有两个参数
1 | --no-edit 执行时不打开默认的编辑器,直接使用 Git 自动生成的提交信息 |
二、丢弃提交
让提交在历史中彻底消失,而不是抵消掉,可以使用 git reset 命令,丢弃某个提交之后的所有提交
1 | git reset [last good SHA] |
git reset 的原理:让最新提交的指针回到以前某个提交点,该提交点之后的提交都从历史中消失
默认情况下,git reset 不改变工作区的文件(但会改变暂存区),–hard 参数可以让工作区里面的文件也回到以前的状态
1 | git reset --hard [last good SHA] |
执行 git reset 命令之后,如果想要找到哪些丢弃的提交,可以使用 git reflog 命令。这种方法有实效性,时间长了可能找不回来
三、替换上一次提交
提交之后,修改提交信息
1 | git commit --amend -m "fixes bug" |
原理:产生一个新的提交对象,替换掉上一次提交产生的提交对象
这时如果暂存区有发生变化的文件,会一起提交到仓库。所以,–amend 不仅可以修改提交信息,还可以整个把上一次提交替换掉
四、撤销工作区的文件修改
如果工作区的某个文件被改乱了,但没有提交,可以用 git checkout 命令找回本次修改之前的文件
1 | git checkout -- [filename] |
原理:先找暂存区,如果该文件有暂存的版本,则恢复该版本,否则恢复上一次提交的版本
注意:工作区的文件变化一旦被撤销,就无法找回了
五、从暂存区撤销文件
如果把一个文件添加到暂存区,使用
1 | git rm --cached [filename] |
不会影响已经提交的内容
六、撤销当前分支的变化
在当前分支上做了几次提交,突然发现放错了分支,这几个提交本应该放到另一个分支
1 | # 新建一个 feature 分支,指向当前最新的提交。这时依然停留在当前分支 |
上面的操作等于是撤销当前分支的变化,将这些变化放到一个新建的分支