作用:将当前 HEAD 重置为指定状态
Git 的四个区域
Workspace
:工作区,就是你平时存放项目代码的地方;Index / Stage
:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息,一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index);Repository
:仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本;Remote
:远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换;
常用命令
命令一
git reset [--soft | --mixed [-N] | --hard | --merge | --keep] [-q] [<commit_id> | HEAD^]
-
–soft
不删除工作区改动代码,撤销
commit
,不撤销git add .
。会在重置 HEAD 和 branch 时,保留工作目录和暂存区中的内容,并把重置 HEAD 所带来的新的差异放进暂存区。
-
–mixed
这是默认动作。
重置位置的同时,只保留Working Tree工作目录的內容,但会将 Index暂存区 和 Repository 中的內容更改和reset目标节点一致,因此原节点和Reset节点之间的【差异变更集】会放入Working Tree工作目录中。所以效果看起来就是原节点和Reset节点之间的所有差异都会放到工作目录中。
-
–hard
重置位置的同时,直接将 working Tree工作目录、 index 暂存区及 repository 都重置成目标Reset节点的內容,所以效果看起来等同于清空暂存区和工作区。
-
–merge
撤销合并(merge)/修订(commit)/变基(rebase)操作,在需要提供ORIG_HEAD(git log 获取的 commit_id)。
- 在执行撤销合并/ 变基时,效果等同于撤销合并(git merge --abort)/撤销变基(git rebase --abort)。
- 在执行修订,效果等同于强制撤销(git reset --hard <commit_id>)
-
–keep
重置分支到指定的提交,保留当前工作目录和暂存区的更改。若重置Reset节点内容与工作目录和暂存区内容存在冲突时,该命令无法执行。
命令二
git reset (--patch | -p) [<tree-ish>] [--] [<pathspec>...]
使用**-p交互性的有选择性地对块进行reset**,这是与git add -p相反的。
命令三
git reset [-q] [<tree-ish>] [--] <pathspec>...
git reset [-q] [--pathspec-from-file=<file> [--pathspec-file-nul]] [<tree-ish>]
匹配pathspec所有路径重置索引条目到git 树的状态。
选项
-
[-q, --quiet, --no-quiet]
安静的执行,只报告错误
-
[–pathspec-from-file=]
从文件读入命令行参数
-
--pathspec-file-nul
在**–pathspec-from-file**模式换行符指定为NUL
-
<pathspec>...
指定操作的路径或者文件。
-
<commit_id>
代表某个版本的 commit_id,可通过 git log 或在 git 平台的 history 中查看。
-
HEAD^
代表HEAD上一个版本,也可以写成 HEAD~1。如果进行了 2 次 commit,想都撤回,可以使用 HEAD~2。
参考
git-reset Document
Git Reset:撤销与回溯,解读5种模式的妙用