Git 的 reset 命令有三种主要模式:
- --soft:只移动 HEAD 指针,不会改变工作树或暂存区的状态,soft 是温和的意思,所以是软重制。
- --mixed(默认模式):移动 HEAD 指针,并且将暂存区恢复到指定的提交状态,但保留工作树中的更改,mixed 是混合/掺杂意思。
- --hard:移动 HEAD 指针,并且将暂存区和工作树都恢复到指定的提交状态。hard 是强制的,特别要注意。
示例
假设你有以下提交历史:
A -> B -> C -> D -> E
你当前处于 E 提交,你想回退到 C 提交
git reset --soft|mixed|hard C
移动 HEAD 指针到 C 提交, --soft|--mixed|--hard 区别是暂存区跟工作树的变更。
A -> B -> C <- HEAD
此时指针已经重置到 C 了。
本地reset之后,如何避免合并之前的提交记录?
如果你想在 reset 后提交新的更改,并且不希望之前的提交记录被合并进来,可以按照以下步骤操作:
- 使用 git reset --hard 回退到指定的提交,之前的local commit都会重置掉,此时远程还是
E版本,所以需求强制push到远程仓库。
git reset --hard C
-- 强制推送到远程分支
git push --force
-- git push -f
好了,之前提交到远程的commit全没了,这意味着...
注意:
备份:在进行强制推送之前,最好先备份当前的远程分支,以防万一。
git push origin :branch_name
这样可以删除远程分支,防止意外覆盖。
通知团队成员:如果你在一个团队中工作,强制推送可能会导致其他人的工作丢失,因此最好提前通知团队成员