git reset -- 和 git restore --staged 【二】

0阅读 0评论2026-03-30 帮我Q下
分类:敏捷开发

一句话git reset:git reset 是“把 HEAD/当前分支指针 移到某个提交”,并且顺便根据 --soft / --mixed / --hard 决定 暂存区(index/stage) 和 工作区(working tree) 要不要一起跟着变。

git reset --soft 可以是 HEAD~1、某个 commit id、某个 tag 等)
? 只移动 HEAD/分支指针
? 暂存区不变
? 工作区不变
用途:“我刚 commit 了,但想把这个 commit 拆成多个 commit/或者改 commit message(配合 re-commit)”
注意:移动分支指针 和 移动HEAD. 
    首先,通常 cat .git/HEAD 的结果: ref: refs/heads/master
    而 cat .git/refs/heads/master 的结果: ae415306e471411c43a5b43e2bbe8eb1391df740
    其次,移动分支指针就是在某个分支上干活,比如在master下干活, .git/refs/heads/master 在变化。 如: 
    git commit #分支前进
    git reset --soft/mixed/hard #分支回退
    git merge ...
    然后,移动 HEAD 就是不在分支上干活,即 .git/HEAD 在变化。 如:
    git checkout HEAD//tag #进入 detached HEAD
    git reset #因为此时 HEAD 是独立飘着的, git reset 只能移动 HEAD 自己
    {BANNED}最佳后,可以用 git branch --show-current 看到底现在在不在分支上:
    ? 有输出 → 分支指针会动
    ? 空输出 → 只有 HEAD 在动

git reset --mixed (默认)
? 移动 HEAD/分支指针
? 暂存区重置为 target 的内容
? 工作区不变
用途:“我想撤销 commit/撤销 git add,但不想丢文件修改”
实用:取消暂存(unstage),
    git reset #取消单个文件暂存. 而新版本的git的restore命令更加直观: git restore  --staged
                     #全称是 git reset --mixed HEAD -- . --mixed 是默认值;HEAD是默认commit;路径分隔符 -- 可省略
    git reset . #取消当前目录所有暂存
    git reset #取消整个仓库所有暂存
例如:1.不小心用 git commit --amend 把暂存区的修改追加到了当前 HEAD 提交上,如何拉回工作区:
    git reflog #查看git操作历史, 找到 amend 前的 HEAD
    a. git reset --soft HEAD@{1} #回退提交 + git reset HEAD . #取消暂存
    b. git reset --soft HEAD@{1} #回退提交 + git restore --staged .#取消暂存
    c. git reset HEAD@{1} #回退提交,同时取消暂存
    如上 a,b,c 方法都可行。
    2.还有本来想 git commit --amend 的,结果用了 git commit,如何拉回工作区:
    git log --oneline #查看简洁的提交历史, 找到 commit 前的 HEAD
    也是如上三种方法。

git reset --hard
? 移动 HEAD/分支指针
? 暂存区重置
? 工作区也重置
用途:“我本地改乱了,确认不要这些改动,直接回到某个提交的干净状态”

上一篇:进入目录执行make
下一篇:I2C/I3C device detected/mounted 问题的定位顺序