git reset --soft
? 只移动 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/
git reset
{BANNED}最佳后,可以用 git branch --show-current 看到底现在在不在分支上:
? 有输出 → 分支指针会动
? 空输出 → 只有 HEAD 在动
git reset --mixed
? 移动 HEAD/分支指针
? 暂存区重置为 target 的内容
? 工作区不变
用途:“我想撤销 commit/撤销 git add,但不想丢文件修改”
实用:取消暂存(unstage),
git reset
#全称是 git reset --mixed HEAD --
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/分支指针
? 暂存区重置
? 工作区也重置
用途:“我本地改乱了,确认不要这些改动,直接回到某个提交的干净状态”