git reset 命令用于将当前HEAD复位到指定状态。简单来说就是,回退你已提交的 commit,并将 commit 的修改内容放回到暂存区。
一般我们在使用 reset 命令时,git reset --hard 会被提及的比较多,它能让 commit 记录强制回溯到某一个节点。而 git reset --soft 的作用正如其名,--soft (柔软的) 除了回溯节点外,还会保留节点的修改内容。
应用场景
- 提交信息不小心写了个错别字
- 将不属于本次提交范畴内的文件提交了
命令使用
现在我们要退回最近一次的提交:
使用命令:
git reset --soft HEAD^
# or
git reset --soft <commitID>
使用git reset --soft
后,将回到你点击确定提交前的状态,此时你更改的代码会留在暂存区,提交信息也会存在,只等你再次按下提交按钮。
以上说的是还未 push 的commit。对于已经 push 的 commit,也可以使用该命令,不过再次 push 时,由于远程分支和本地分支有差异,需要强制推送 git push -f
来覆盖被 reset 的 commit。
还有一点需要注意,在 reset --soft 指定 commit 号时,会将该 commit 到最近一次 commit 的所有修改内容全部恢复,而不是只针对该 commit。该操作导致的问题就是你需要重新编写这几次的提交信息。
使用命令查看进三次的提交:
git log --pretty=online -3
--pretty=online
会美化输出的提交信息,-3
输出最近的三条提交记录,是 -n 3
参数的简写。 如下图:
现在将提交信息为 a 的提交退回。复制出 commit ID进行回退:
git reset --soft 225772480c8658837199ccadd7bd0cff787cebc0
此时HEAD指向了a,b,c 回到了暂存区,