# 一、撤销提交
git revert HEAD
:
- 提交代码后,意识到代码有问题。
- 在当前提交后面新增一次提交,抵消上一次提交导致的所有变化,不会改变过去的历史
- 一般来说是首选的撤销方式,不会有丢失代码的风险
git revert
命令只能抵消上一次的提交,想抵消多个的话,需要再命令行依次指定这些提交,比如,抵消前两个提交:
$ git revert [倒数第一个提交] [倒数第二个提交]
# 二、丢弃提交
通过git reset
可以使以前的提交记录彻底消失,而不是抵消。可以丢弃掉某个提交后的所有提交。
$ git reset [last good SHA]
git reset
的原理是,让最新提交的指针回到以前某个时点,该时点之后的提交都从历史中消失。
默认情况下,git reset
不改变工作区的文件(但会改变暂存区),--hard
参数可以让工作区里面的文件也回到以前的状态。
$ git reset --hard [last good SHA]
执行git reset
命令之后,如果想找回那些丢弃掉的提交,可以使用git reflog
命令,具体做法参考这里 (opens new window)。不过,这种做法有时效性,时间长了可能找不回来。
# 三、替换上一次提交
提交以后,发现提交信息写错了,这时可以使用git commit
命令的--amend
参数,可以修改上一次的提交信息。
$ git commit --amend -m "Fixes bug #42"
它的原理是产生一个新的提交对象,替换掉上一次提交产生的提交对象。
这时如果暂存区有发生变化的文件,会一起提交到仓库。所以,--amend
不仅可以修改提交信息,还可以整个把上一次提交替换掉。
# 四、撤销工作区的文件修改
如果工作区的某个文件被改乱了,但还没有提交,可以用git checkout
命令找回本次修改之前的文件。
$ git checkout -- [filename]
它的原理是先找暂存区,如果该文件有暂存的版本,则恢复该版本,否则恢复上一次提交的版本。
注意,工作区的文件变化一旦被撤销,就无法找回了。
# 五、从暂存区撤销文件
如果不小心把一个文件添加到暂存区,可以用下面的命令撤销。
$ git rm --cached [filename]
上面的命令不影响已经提交的内容。
# 六、撤销当前分支的变化
你在当前分支上做了几次提交,突然发现放错了分支,这几个提交本应该放到另一个分支。
# 新建一个 feature 分支,指向当前最新的提交 # 注意,这时依然停留在当前分支 $ git branch feature # 切换到这几次提交之前的状态 $ git reset --hard [当前分支此前的最后一次提交] # 切换到 feature 分支 $ git checkout feature
上面的操作等于是撤销当前分支的变化,将这些变化放到一个新建的分支。