日常写代码中,少不了撤销当前编辑的代码、撤销某次提交的代码、撤销正在合并或已经合并的代码,这就需要用到 git 中的某些方法了。下面是我遇到的问题跟用到的一些方法记录。
git reset 指代码回退到某个版本状态。其实质是修改当前 HEAD 的位置到指定回退版本的位置,所以夹在当前跟回退指定的版本之间的版本会一起回退。
git reset --mixed HEAD^
HEAD^:指定位置参数,必写。
HEAD^ -- 最后一次 commit 版本;
HEAD -- 当前未 commit 版本(即工作区或已暂存的代码);
commit_id -- 某次提交的 commit id 版本;
--mixed:回退的程度参数,选填。
--hard -- 撤销 commit、撤销 add、撤销代码改动;
--mixed -- 撤销 commit、撤销 add、不撤销代码改动;-- 默认参数
--soft -- 撤销 commit、不撤销 add、不撤销代码改动;
场景一:撤销当前编辑的代码,即未 commit 代码,(包括当前正在合并的代码)
git reset --hard HEAD
git merge --abort // 丢弃正在合并的代码(只能用在正在合并的代码)
场景二:提交之后才意识到有个错误,于是把代码回退到之前编辑状态
git reset --mixed HEAD^ // 相当回退到之前未提交未暂存的代码状态
场景三:撤销第 N 次前的提交
假如 N 次的提交都可以不要了,就能用 git reset --hard commit_id;
假如只是第 N 次提交的代码不要,则需另个方法 git revert,反做某一次提交。
git revert commit_id – 新增一次新的提交,代码操作跟 commit_id 这次相反,即撤销指定版本的提交了。
注意:
git revert 是新增一次操作达到撤销某次提交的目的,其提交记录能被查询到,git reset 是通过回退到某个版本位置来达到撤销目的,其操作记录跟被回退的提交记录都不能被查询到(实质是 HEAD 位置的改变)。看似 git revert 这方法更科学,不会抹去任何提交记录,但网上看到不少提示 git revert 坑的出现,所以这方法慎用。
场景四:撤销已经 push 到远程的上次提交
git reset --hard HEAD^ // 本地先撤销上次提交
git pull --f origin xxx // reset 干脆利落,远程的 reset 需注意,清楚是否会回退别人 push 的代码