Git reset

272 阅读1分钟

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 后提交新的更改,并且不希望之前的提交记录被合并进来,可以按照以下步骤操作:

  1. 使用 git reset --hard 回退到指定的提交,之前的local commit都会重置掉,此时远程还是 E 版本,所以需求强制push到远程仓库。
    git reset --hard C
    -- 强制推送到远程分支
    git push --force
    -- git push -f

好了,之前提交到远程的commit全没了,这意味着...

注意:

备份:在进行强制推送之前,最好先备份当前的远程分支,以防万一。

git push origin :branch_name

这样可以删除远程分支,防止意外覆盖。

通知团队成员:如果你在一个团队中工作,强制推送可能会导致其他人的工作丢失,因此最好提前通知团队成员