git如何撤销commit:分两种模式操作
git如何撤销commit分为软撤销与硬撤销两类,软撤销执行gitreset--softHEAD~1,会撤回本次提交记录,代码改动保留在暂存区,适合你只改提交备注、补充文件再重新提交的场景;硬撤销执行gitreset--hardHEAD~1,提交记录与本地改动全部清除,适合提交后确认代码完全错误、不需要保留改动的场景,两种操作都只作用于本地仓库,已经push到远程分支的commit不能直接用reset覆盖,否则会造成远程仓库分支冲突,多人协作分支优先使用revert生成新提交来回滚。
git如何撤销commit的两种方式对比
| 命令 | 改动留存位置 | 适用场景 | 协作风险 |
|---|---|---|---|
| gitreset--softHEAD~1 | 暂存区 | 修改commit注释,追加文件重提 | 风险较低,未推送远程可直接使用 |
| gitreset--hardHEAD~1 | 改动直接删除 | 提交代码完全无用,不需要留存修改 | 风险偏高,本地未推送才适合执行 |
| gitrevertHEAD | 生成反向新commit | 已推送到远程、多人共用分支 | 风险较低,不会改写历史记录 |
HEAD~1代表上一次提交,如果你需要撤销更早的commit,可以替换成目标提交哈希值,哈希值能通过gitlog命令查看,复制commit前面一串字符替换HEAD~1即可。执行gitlog后,输出信息里每一条commit都附带唯一哈希标识,它是定位历史提交的凭证,输入前几位字符,Git一般也能识别对应记录。
软撤销操作之后,你的代码改动还处于add之后的暂存状态,你可以直接修改commit备注,使用gitcommit--amend命令覆盖上一条提交信息,也可以新增或者移除文件,重新执行gitcommit提交,整个过程不会丢失你写好的代码内容。
硬撤销不会保留改动。
硬撤销执行之后,本地未保存、未提交的代码修改会被清除,编辑器里未保存的内容也无法通过Git找回,如果你本地有重要改动,执行前建议先复制代码备份到其他文件,避免内容丢失。这个操作改写Git本地提交历史,已经推送到远程公共分支时不要使用。
已经推送到远程仓库的commit,不能直接用reset强行回退远程分支,团队其他成员已经拉取这份代码的情况下,强行推送reset后的分支,会导致其他人本地分支和远程分支历史不一致,后续合并会出现大量冲突。这时你选用gitrevertHEAD,该命令创建一条反向提交,抵消之前提交带来的代码变更,原有提交记录依旧保留在提交日志里,符合多数团队的分支管理习惯。
撤销多个连续commit时,HEAD~n里的n填写对应数字,撤销最近3次commit就写HEAD~3,同样区分soft和hard参数。这种批量reset依旧只推荐在本地还没有推送远程的独立分支使用,个人开发私有分支约束更少,公共协作分支一律优先revert方案。
执行撤销操作后,你可以用gitstatus查看当前仓库状态,校验文件和暂存区是否符合预期。软撤销后gitstatus会显示待提交变更,硬撤销后gitstatus会提示工作区干净,没有待提交内容,revert之后会看到一条新的待提交记录。
